2016-02-04 9 views
5

के बाद दो सूचियों में से एक को दोहराते हुए मेरे पास दो सूचियां list1 और list2 संख्याएं हैं, और मैं उन्हें एक ही निर्देश के साथ पुन: सक्रिय करना चाहता हूं। इस तरह:एक और

for item in list1: 
    print(item.amount) 
    print(item.total_amount) 

for item in list2: 
    print(item.amount) 
    print(item.total_amount) 

लेकिन यह अनावश्यक लगता है। मुझे पता है कि मैं for item in list1 + list2: लिख सकता हूं, लेकिन इसमें रन-टाइम की कीमत है।

क्या कोई ढीला समय बिना ऐसा कोई तरीका है?

उत्तर

11

यह itertools.chain साथ किया जा सकता:

import itertools 

l1 = [1, 2, 3, 4] 

l2 = [5, 6, 7, 8] 

for i in itertools.chain(l1, l2): 
    print(i, end = " ") 

कौन सा प्रिंट होगा:

1 2 3 4 5 6 7 8 

प्रलेखन के अनुसार, chain निम्नलिखित है:

पुनरावर्तक बनाओ जो पहले इसे तब तक लागू करता है जब तक इसे निकाला नहीं जाता है ऑस्टेड, फिर अगले पुनरावर्तनीय तक पहुंच जाता है, जब तक कि सभी पुनरावृत्त समाप्त नहीं हो जाते हैं।

आप एक सूची में अपनी सूची है, तो itertools.chain.from_iterable उपलब्ध है:

l = [l1, l2] 
for i in itertools.chain.from_iterable(l): 
    print(i, end= " ") 

कौन सा एक ही परिणाम प्राप्त होते हैं।

यदि आप इस के लिए एक मॉड्यूल आयात करने के लिए एक समारोह लिखने के लिए यह बहुत सीधी-सपाट है चाहते हैं:

def custom_chain(*it): 
    for iterab in it: 
     yield from iterab 

यह अजगर 3, अजगर 2 के लिए की आवश्यकता है, बस yield उन्हें वापस एक का उपयोग कर पाश:

def custom_chain(*it): 
    for iterab in it: 
     for val in iterab: 
      yield val 

पिछले, उसके विस्तारित unpacking सामान्यीकरण के साथ अजगर 3.5 के अलावा, यह भी सूची शाब्दिक में खोल की अनुमति देता है:

for i in [*l1, *l2]: 
    print(i, end=' ') 

हालांकि यह l1 + l2 से थोड़ा तेज है, फिर भी यह एक सूची बनाता है जिसे तब फेंक दिया जाता है; केवल अंतिम समाधान के रूप में इसके लिए जाओ।

1

chain काम करता है, लेकिन अगर आपको लगता है कि यह एक मॉड्यूल आयात करने के लिए overkill है बस एक ही समारोह में एक बार फोन करने के लिए, आप अपने व्यवहार इनलाइन को दोहराने कर सकते हैं:

for seq in (list1, list2): 
    for item in seq: 
    print(item.amount) 
    print(item.total_amount) 

(List1, List2) बनाना टपल हे है (1) सूची की लंबाई के संबंध में, इसलिए इसे सूचियों को एक साथ जोड़ने की तुलना में अनुकूल प्रदर्शन करना चाहिए।