سؤال

لدي التعليمات البرمجية التالية التي أستخدمها لتعيين قائمة متداخلة في Python لإنتاج قائمة بنفس البنية.

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]

هل يمكن القيام بذلك مع الفهم القائمة وحده (بدون استخدام وظيفة الخريطة)؟

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

المحلول

للحصول على قوائم متداخلة، يمكنك استخدام اختصاصات قائمة متداخلة:

nested_list = [[s.upper() for s in xs] for xs in nested_list]

أنا شخصيا أجد map أن تكون نظافة في هذه الحالة، على الرغم من أنني أفضل تقريبا تفضل قائمة الفهم. لذلك حقا مكالمتك، لأن إما ستعمل.

نصائح أخرى

تذكر زن بيثون:

هناك عموما أكثر من واحد - وربما العديد من - طرق واضحة للقيام بذلك. **

** ملاحظة: تم تحريرها للتأكد من دقتها.

على أي حال، أنا أفضل الخريطة.

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )

الخريطة هي بالتأكيد طريقة أكثر نظافة للقيام بما تريد. يمكنك أن تزيل الفهم القائمة، ربما هذا ما أنت بعد؟

[[ix.upper() for ix in x] for x in nested_list]

هنا هو الحل ل قائمة متداخلة لها عمق تعسفي:

def map_nlist(nlist=nlist,fun=lambda x: x*2):
    new_list=[]
    for i in range(len(nlist)):
        if isinstance(nlist[i],list):
            new_list += [map_nlist(nlist[i],fun)]
        else:
            new_list += [fun(nlist[i])]
    return new_list

تريد الحالة العليا كل ما تقوم بإدراج العنصر، فقط اكتب

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]

والأهم من ذلك، هذه الوظيفة العودية يمكن أن تفعل أكثر من هذا!

أنا جديد في بيثون، لا تتردد في مناقشة!

أعطت الملصقات الأخرى الإجابة، ولكن كلما أواجه مشكلة في التفاف رأسي حول بناء وظيفي، ابتلع فخري وتهجؤه لفترة طويلة مع الأساليب غير المثلى الصافية و / أو الكائنات. قلت أنك تريد أن ينتهي بمولد، لذلك:

for xs in n_l:
    def doUpper(l):
        for x in l:
            yield x.upper()
    yield doUpper(xs)

for xs in n_l:
    yield (x.upper() for x in xs)

((x.upper() for x in xs) for xs in n_l)

في بعض الأحيان يكون نظافة للحفاظ على واحدة من الإصدارات الجلدية. بالنسبة لي، خريطة وتقليل أحيانا جعلها أكثر وضوحا، ولكن قد تكون التعابير بيثون أكثر وضوحا للآخرين.

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