استرجاع tuple من مجموعة من الصفوف على أساس الوارد القيمة
سؤال
لدي بنية البيانات التي هي عبارة عن مجموعة من الصفوف مثل هذا:
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']