ما هي أسهل طريقة للبحث من خلال قائمة من الديكتات في بيثون؟

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

  •  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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top