استرجاع tuple من مجموعة من الصفوف على أساس الوارد القيمة

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

  •  20-08-2019
  •  | 
  •  

سؤال

لدي بنية البيانات التي هي عبارة عن مجموعة من الصفوف مثل هذا:

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

أول و ثالث عناصر هي فريدة من نوعها لكل مجموعة.

ما أريد القيام به هو استرداد محدد tuple بالرجوع إلى القيمة الثالثة, على سبيل المثال:

>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")

يجب أن يكون هناك طريقة أفضل من كتابة حلقة تحقق كل قيمة واحدا تلو الآخر!

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

المحلول

إذا things هي قائمة، وأنت تعرف أن العنصر الثالث هو متالقه، ماذا عن قائمة على الفهم؟

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]

وعلى الرغم من تحت غطاء محرك السيارة، وأفترض أن يذهب من خلال كل القيم ويتحقق منها على حدة. إذا كنت لا تحب ذلك، ماذا عن تغيير هيكل my_things بحيث انها dict واستخدام إما الأول أو القيمة الثالثة كمفتاح؟

نصائح أخرى

حلقة (أو شيء 100% ما يعادل مثل قائمة على الفهم أو genexp) هو حقا النهج الوحيد إذا كان الخاص بك الخارجي على مستوى الهيكل tuple ، كما تشير -- الصفوف ، المتعمدة تصميم غاية خفيفة الوزن الحاوية مع أي أساليب في الواقع (فقط عدد قليل من الأساليب الخاصة اللازمة لتنفيذ الفهرسة, حلقات و مثل؛ -).

بسرعة البرق استرجاع هو سمة من القواميس ، ليس الصفوف.لا يمكن أن يكون لديك قاموس (كما هو الهيكل الرئيسي ، أو الجانب مساعد واحد) رسم الخرائط "قيمة العنصر الثالث" إلى subtuple كنت تسعى (أو المؤشر الرئيسي tuple ، ربما) ؟ يمكن أن يبنى مع حلقة واحدة ثم تقديم العديد من عمليات البحث السريعة كما يهمك أن يكون!

إذا اخترت حلقة ، genexp كما في بريان تعليق غير ردي على ذلك هو أكثر قابلية للقراءة في المتوسط ربما أسرع مرتين من listcomp (كما يفعل إلا نصف حلقات):

my_thing = next(item for item in things if item[2] == "Blurgle")

الذي يقرأ بسلاسة كما "البند التالي في الأشياء التي [2] في البند الفرعي equale Blurgle" (كما بدأنا من البداية "التالي" البند تجد ستكون "أول" - و في حالتك فقط مناسبة واحدة).

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

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

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

things_dict = {}
for t in things:
    things_dict[t[2]] = t

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