باستخدام 'في' لمباراة سمة من بيثون الكائنات في مجموعة

StackOverflow https://stackoverflow.com/questions/683

  •  08-06-2019
  •  | 
  •  

سؤال

أنا لا أتذكر ما إذا كنت تحلم أم لا ولكن يبدو أنني أتذكر أنه كان هناك وظيفة مما سمح شيء من هذا القبيل ،

foo in iter_attr(array of python objects, attribute name)

لقد بحثت على مستندات ولكن هذا النوع من الشيء لا تندرج تحت أي واضح المدرجة رؤوس

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

المحلول

باستخدام قائمة الفهم بناء على قائمة مؤقتة ، والتي يمكن أن تأكل كل ما تبذلونه من الذاكرة إذا كان تسلسل تفتيشه كبيرة.حتى لو كان تسلسل ليست كبيرة ، بناء قائمة يعني بالتكرار على كل من تسلسل قبل in يمكن أن تبدأ البحث.

المؤقتة القائمة يمكن تجنب باستخدام مولد التعبير:

foo = 12
foo in (obj.id for obj in bar)

الآن, طالما obj.id == 12 بالقرب من بداية bar, البحث سوف تكون سريعة ، حتى إذا bar بلا حدود طويلة.

كما @مات اقترح انها فكرة جيدة لاستخدام hasattr إذا كان أي من الكائنات في bar يمكن أن يكون في عداد المفقودين id السمة:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))

نصائح أخرى

هل تبحث للحصول على قائمة من الكائنات التي لها سمة معينة?إذا كان الأمر كذلك ، قائمة على الفهم هو الطريق الصحيح للقيام بذلك.

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]

يمكنك دائما كتابة واحدة نفسك:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

سوف تعمل مع أي شيء أن تتكرر ، tuple, قائمة, أو أيا كان.

أنا أحب بيثون ، يجعل مثل هذه الاشياء بسيطة جدا و لا مزيد من المتاعب من الضروره في استخدام مثل هذه الاشياء كبيرة أنيقة.

لا, أنت لا تحلم.الثعبان لديه جدا ممتازة قائمة على الفهم النظام الذي يتيح لك التعامل مع قوائم جدا أنيق و اعتمادا على بالضبط ما تريد تحقيقه ، ويمكن أن يتم ذلك بعدة طرق.في جوهر, ماذا تفعل تقول "البند في قائمة المعايير.مباريات", و من ذلك يمكنك فقط من خلال تكرار النتائج أو تفريغ النتائج في قائمة جديدة.

انا ذاهب الى السرير مثال من الغوص في بايثون هنا, لأنها جميلة وأنيقة أنهم أذكى مني.هنا انهم الحصول على قائمة من الملفات في الدليل ، ثم تصفية قائمة لجميع الملفات التي تتطابق مع التعبير العادي المعايير.

    files = os.listdir(path)                               
    test = re.compile("test\.py$", re.IGNORECASE)          
    files = [f for f in files if test.search(f)]

هل يمكن أن تفعل هذا دون التعابير العادية ، على سبيل المثال ، عن أي شيء حيث التعبير الخاص بك في نهاية المطاف العودة الحقيقية للمباراة.هناك خيارات أخرى مثل استخدام فلتر (وظيفة), ولكن إذا كنت سوف تختار ، كنت أذهب مع هذا.

إريك Sipple

وظيفة كنت تفكر على الأرجح operator.attrgettter.على سبيل المثال للحصول على قائمة تحتوي على قيمة كل كائن "id" السمة:

import operator
ids = map(operator.attrgetter("id"), bar)

إذا كنت تريد أن تحقق ما إذا كانت القائمة تحتوي على كائن مع معرف == 12 ، ثم أنيق وفعال (أيلا تكرار قائمة كاملة دون داع) طريقة للقيام بذلك هي:

any(obj.id == 12 for obj in bar)

إذا كنت ترغب في استخدام 'في' مع attrgetter ، في حين لا يزال الإبقاء كسول التكرار من القائمة:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)

ما كنت أفكر يمكن تحقيقه باستخدام قائمة comprehensions, ولكن أعتقد أن هناك وظيفة في قليلا أكثر إتقانا الطريق.

أي'شريط' هي قائمة من الأشياء التي يجب السمة 'id'

الأسطورية وظيفية الطريقة:

foo = 12
foo in iter_attr(bar, 'id')

قائمة الفهم الطريقة:

foo = 12
foo in [obj.id for obj in bar]

في وقت لاحق قائمة الفهم الطريقة هو أنيق جدا على أي حال.

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

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

تذكر الثعبان واحدة من الأكثر كفاءة خوارزميات التجزئة في جميع أنحاء.استخدام هذا لصالحك.

أعتقد:

#!/bin/python
bar in dict(Foo)

هو ما كنت أفكر.عند محاولة لمعرفة ما إذا كان مفتاح معين موجود داخل القاموس في بايثون (python نسخة من جدول تجزئة) هناك طريقتان للتحقق.الأول هو has_key() طريقة تعلق القاموس الثاني هو المثال المذكور أعلاه.فإنه سيتم إرجاع قيمة منطقية.

أن الإجابة على سؤالك.

و الآن قليلا عن الموضوع في هذا التعادل إلى قائمة على الفهم الجواب سابقا (قليلا أكثر وضوحا). قائمة Comprehensions بناء قائمة من الأساسي حلقة مع المعدلات.كمثال (توضيح قليلا), طريقة استخدام in dict لغة بناء في قائمة على الفهم:

نقول لديك اثنين من الأبعاد القاموس foo وتريد فقط البعد الثاني القواميس التي تحتوي على مفتاح bar.بسيطة نسبيا طريقة للقيام بذلك سيكون لاستخدام قائمة على الفهم مع المشروط على النحو التالي:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

ملاحظة if bar in value في نهاية البيان** هذا هو تعديل البند الذي يحكي قائمة على الفهم فقط تبقى تلك أزواج قيمة المفتاح التي تلبي المشروطة.** في هذه الحالة baz هو القاموس الذي يحتوي فقط على القواميس من فو الذي يحتوي على بار (أمل لم تفوت أي شيء في هذا المثال رمز...قد تحتاج إلى إلقاء نظرة على قائمة الفهم وثائق وجدت في docs.python.org الدروس و في secnetix.de, سواء مواقع مراجع جيدة إذا كان لديك أسئلة في المستقبل.).

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