मैं फॉर्म के तारों को बदलने की कोशिश कर रहा हूँ

'[[2, 3.1], [4/5, 5/6]]'

भिन्न मॉड्यूल से भिन्न वस्तुओं की 2d सूची में। ऊपर दिए गए विशेष मामले में, परिणाम होना चाहिए

[[Fraction(2, 1), Fraction(31, 10)], [Fraction(4, 5), Fraction(5, 6)]]

स्ट्रिंग में रिक्ति आवश्यक रूप से समान नहीं होगी जैसा कि मैंने इसे लिखा है (कोई स्थान नहीं, अतिरिक्त स्थान, रिक्त स्थान की असमान संख्या, आदि)।

मैं इसे कई चरणों में बाहरी कोष्ठकों को छीलकर, ']'s पर स्ट्रिंग को विभाजित करके, परिणामी सूची से खाली स्ट्रिंग्स को हटाकर, सूची में प्रत्येक स्ट्रिंग की शुरुआत से किसी भी नॉनडिजिट को थोड़ी देर में हटाकर कर सकता हूं। , उन स्ट्रिंग्स में से प्रत्येक को अल्पविराम में विभाजित करना, और अंत में नेस्टेड सूचियों के तत्वों को भिन्न में परिवर्तित करना।

लेकिन यह काफी बोझिल है। क्या इसके लिए कोई बेहतर उपाय है?

3
got it--thanks 31 मार्च 2018, 06:02

2 जवाब

मैं एक निफ्टी कोड स्निपेट लेकर आया हूं जो इसमें आपकी मदद कर सकता है:

from fractions import Fraction
input_string = '[[2, 3.1], [4/5, 5/6]]'
parsed_input = [item for item in ''.join((char if char in '0123456789./' else '-') for char in input_string).split('-') if item]
output_array = [Fraction(i).limit_denominator(10) for i in parsed_input]

मैं इस उम्मीद में हूँ की इससे मदद मिलेगी। कृपया किसी भी अस्पष्टता के मामले में टिप्पणी अनुभाग का उपयोग करें।

1
iam.Carrot 31 मार्च 2018, 08:10
import ast
import re
from fractions import Fraction

input_text = '[[2, 3.1], [1e100, -5/6]]'

transformed_text = ast.literal_eval(re.sub(r'([^,\[\]\s]+)', r'"\1"', input_text))
transformed_text =  [[ Fraction(j) for j in i]  for i in transformed_text ]
  • रेगेक्स सरल है: Fraction(...) कई अलग-अलग इनपुट रूपों को संभाल सकता है; यहां देखें https://docs.python.org/3/library/ भिन्नों.html#fractions.Fraction नोट के साथ
    कि संस्करण 3.2 के बाद से Fraction कंस्ट्रक्टर अब float और decimal.Decimal instances स्वीकार करता है।
  • ast.literal_eval नहीं eval
0
Hotschke 4 नवम्बर 2018, 14:17