سؤال

ولدي السلاسل التي تبدو مثل هذا:

"(8, 12.25), (13, 15), (16.75, 18.5)"

ووأود أن تحويل كل منهم إلى بنية بيانات الثعبان. ويفضل أن يكون على قائمة (أو الصفوف (tuple)) من المجموعات التي تحتوي على زوج من قيم التعويم.

وأنا يمكن أن نفعل ذلك مع eval("(8, 12.25), (13, 15), (16.75, 18.5)") الذي يعطيني الصفوف (tuple) من المجموعات، ولكن لا أعتقد بسذاجة تقييم المعلومات الخارجية سيكون قرارا حكيما.

وهكذا كنت أتساءل ما حل pythonic أنيقة قد تبدو.

هل كانت مفيدة؟

المحلول

>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))

نصائح أخرى

def parse(s):
    tuples = s.split('), ')
    out = []
    for x in tuples:
        a,b = x.strip('()').split(', ')
        out.append((float(a),float(b)))
    return out

وهذا ينبغي القيام بهذه المهمة.

ولقد استعملت safe_eval للحصول على وظائف من هذا القبيل في الماضي.

إذا كنت تعمل مع ملف CSV، وتريد أكثر من حل "ساذج" الذي لا يعالج أي أخطاء، وربما كنت أفضل حالا باستخدام في بايثون وحدة CSV .

PyParsing .

ولقد عملت معه من قبل. يمكنك الحصول على بعض السلوك تحليل قوي جدا للخروج منه، وأعتقد أنه يوفر builtins الذي سيقوم بمعالجة الاحتياجات إعراب لكم كامل مع هذا النوع من الشيء. بحث عن commaSeparatedList وnestedExpr.

ما هو الخطأ في القيام بشكل منهجي؟ انقسام حول ")"، ثم انتقل من خلال قائمة، وإزالة جميع "(".

>>> s="(8, 12.25), (13, 15), (16.75, 18.5)"
>>> [ i.replace("(","") for i in s.split(")") ]
['8, 12.25', ', 13, 15', ', 16.75, 18.5', '']
>>> b = [ i.replace("(","") for i in s.split(")") ]
>>> for i in b:
...  print i.strip(", ").replace(" ","").split(",")
...
['8', '12.25']
['13', '15']
['16.75', '18.5']
['']

والآن يمكنك تحقيق كل عنصر في بنية البيانات الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top