2013-08-08 12 views
6

की एक सूची का एक सबसेट से अधिक पुनरावृत्ति कहते हैं कि मैं के रूप मेंअजगर - tuples

l = [(4,1), (5,1), (3,2), (7,1), (6,0)] 

इस प्रकार मैं आइटम जहां टपल में 2 तत्व 1 है से अधिक पुनरावृति करना चाहते हैं tuples के सूची है की सुविधा देता है ?

मैं इसे लूप में एक शर्त का उपयोग कर कर सकता हूं, लेकिन मुझे आशा थी कि पायथनिक ऐसा करने का तरीका होगा?

धन्यवाद

+0

हम्म, आत्म करने के लिए ध्यान दें: उपयोग कभी नहीं ' एक प्रतीक के रूप में एल '(ell)। इसी प्रकार 'ओ' (ओह)। –

उत्तर

6

आप एक सूची समझ का उपयोग कर सकते हैं: उसके बाद, आप कुछ भी आप तत्वों, पाया विशेष रूप से, मैं छोड़ दिया पर इस हिस्से में मूल जोड़ी के पुनर्निर्माण कर रहा हूँ के साथ चाहते हैं कर सकते हैं साथ ही आप जनरेटर सिंटैक्स का उपयोग tuples की पुनरावृति कर सकते हैं:

for tup in (x for x in l if x[1] == 1): 
    ... 
+3

वह genexp बराबर 'if' कथन की तुलना में बहुत कम पठनीय है। यह एक बुरा विचार की तरह लगता है। – user2357112

3

के बारे में
ones = [(x, y) for x, y in l if y == 1] 

या

ones = filter(lambda x: x[1] == 1, l) 
1

इस प्रयास करें कैसे, list comprehensions pythonic तरीका समस्या को हल करने का उपयोग कर रहा है:

lst = [(4,1), (5,1), (3,2), (7,1), (6,0)] 
[(x, y) for x, y in lst if y == 1] 
=> [(4, 1), (5, 1), (7, 1)] 

सूचना है कि हम कैसे जोड़ी में प्रत्येक तत्व को प्राप्त करने के लिए tuple unpacking x, y का उपयोग करें, और कैसे स्थिति if y == 1 जोड़ी के दूसरे तत्व में मूल्य 1 के साथ केवल उन तत्वों को फ़िल्टर करती है।

[ x for x in l if x[1] == 1 ] 

: (x, y)

3

बस if का उपयोग करें। यह स्पष्ट और सरल है।

for x, y in tuples: 
    if y == 1: 
     do_whatever_with(x) 
+1

* "मैं इसे लूप में एक शर्त का उपयोग कर कर सकता हूं, लेकिन मुझे उम्मीद थी कि ऐसा करने के लिए अमीर पाइथोनिक तरीका होगा?" * – arshajii

+1

यह * यह करने के लिए पाइथोनिक तरीका है। जेनरेटर और सूची समझ उनके उद्देश्यों के लिए ठीक हैं, लेकिन यदि आप वास्तव में एक पुनरावर्तनीय बनाने के बजाय किसी चीज़ पर फिर से शुरू करना चाहते हैं, तो यह रास्ता तय करना है। क्या आप ईमानदारी से दावा कर सकते हैं कि जीनएक्सपी पर लूपिंग अधिक पठनीय है? – user2357112

2

इस पर एक जनरेटर बिल्ड:

has_1 = (tup for tup in l if l[1] == 1) 
for item in has_1: 
    pass 
1

जब से तुम पुनरावृति करना चाहते हैं, itertools.ifilter एक अच्छा समाधान है:

from itertools import ifilter 
iter = ifilter(lambda x: x[1] == 1, l) 
for item in iter: 
    pass 
+0

यह एक अच्छा समाधान नहीं है जहां परीक्षण आसानी से 'if' खंड में कैप्चर किया जा सकता है। – Marcin