ما هي أسهل طريقة للبحث من خلال قائمة من الديكتات في بيثون؟
-
29-09-2019 - |
سؤال
تقوم قاعدة البيانات الخاصة بي حاليًا بإرجاع قائمة بالديكتات:
id_list = ({'id': '0c871320cf5111df87da000c29196d3d'},
{'id': '2eeeb9f4cf5111df87da000c29196d3d'},
{'id': '3b982384cf5111df87da000c29196d3d'},
{'id': '3f6f3fcecf5111df87da000c29196d3d'},
{'id': '44762370cf5111df87da000c29196d3d'},
{'id': '4ba0d294cf5111df87da000c29196d3d'})
كيف يمكنني التحقق بسهولة مما إذا كان معرف معين في هذه القائمة أم لا؟
شكرًا.
المحلول
إذا قمت بعمل قاموس لمعرف البحث الخاص بك ،
search_dic = {'id': '0c871320cf5111df87da000c29196d3d'}
id_list = ({'id': '0c871320cf5111df87da000c29196d3d'},
{'id': '2eeeb9f4cf5111df87da000c29196d3d'},
{'id': '3b982384cf5111df87da000c29196d3d'},
{'id': '3f6f3fcecf5111df87da000c29196d3d'},
{'id': '44762370cf5111df87da000c29196d3d'},
{'id': '4ba0d294cf5111df87da000c29196d3d'})
if search_dic in id_list:
print 'yes'
نصائح أخرى
ها هو خط واحد:
if some_id in [d.get('id') for d in id_list]:
pass
غير فعال للغاية رغم ذلك.
تعديل - قد يكون النهج الأفضل:
if some_id in (d.get('id') for d in id_list):
pass
بهذه الطريقة ، لم يتم إنشاء القائمة بشكل كامل مسبقًا.
كيف يمكنني التحقق بسهولة مما إذا كان معرف معين في هذه القائمة أم لا؟
اصنع مجموعة
keys = set( d['id'] for d in id_list )
if some_value in keys
لا تسأل عما إذا كان هذا "فعال" أو "الأفضل". أنه ينطوي على المقايضة القياسية.
بناء المجموعة يستغرق وقتا. لكن البحث ثم لحظة.
إذا قمت بالكثير من عمليات البحث ، يتم إطفاء تكلفة بناء المجموعة على كل عملية بحث.
إذا قمت بعمل عدد قليل من عمليات البحث ، فقد تكون تكلفة بناء المجموعة أعلى من شيء ما
{'id':some_value} in id_list
.
any(x.get('id')==given_id for x in id_list)
. . . يعود منطقية. نجاعة؟ انظر إجابة S.Lott
يمكنك تسطيحه مع فهم قائمة واستخدامه في:
id in [d['id'] for d in id_list]
يمكنك أيضًا استخدام تعبيرات المولدات ، والتي لها خصائص أداء مختلفة (وستستخدم ذاكرة أقل إذا كانت قائمتك ضخمة):
id in (d['id'] for d in id_list)