2013-02-21 8 views

उत्तर

49

पहले एक iterable 0 या अधिक तर्क, प्रत्येक लेता है, दूसरा एक एक तर्क जो iterables उत्पादन की उम्मीद है लेता है:

itertools.chain(list1, list2, list3) 

iterables = [list1, list2, list3] 
itertools.chain.from_iterable(iterables) 

लेकिन iterables किसी भी इटरेटर कि iterables पैदावार हो सकती है।

def generate_iterables(): 
    for i in range(10): 
     yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

का उपयोग करते हुए दूसरा रूप आमतौर पर सुविधा का एक मामला है, लेकिन क्योंकि यह इनपुट से अधिक लूप lazily iterables, यह भी एक ही रास्ता है कि आप कर सकते श्रृंखला एक अनंत परिमित iterators की संख्या:

def generate_iterables(): 
    while True: 
     for i in range(5, 10): 
      yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

ऊपर के उदाहरण आप एक iterable कि संख्या है कि कभी बंद नहीं करेंगे की एक चक्रीय पैटर्न पैदावार दे देंगे, लेकिन क्या एक भी range() कॉल की आवश्यकता है और अधिक से अधिक स्मृति का उपभोग कभी नहीं होगा।

+2

मुझे अभी भी यह नहीं मिल रहा है। क्या आप मुझे आउटपुट भिन्न कर सकते हैं और व्यावहारिक परिस्थिति में केस का उपयोग कर सकते हैं, जहां – user1994660

+8

@ user1994660 का उपयोग करना है: कोई आउटपुट अंतर नहीं है। यह एक * इनपुट * अंतर है। यह कुछ इनपुट का उपयोग करना आसान बनाता है। –

+0

@ user1994660: मैं [इस उत्तर] में दूसरे फॉर्म का उपयोग करता हूं (http://stackoverflow.com/questions/12900444/trying-to-add-to-dictionary-values-by-counting-occurrences-in-a-list के- सूचियों-पी/12900577 # 12900577)। –

1

वे बहुत समान चीजें करते हैं। छोटी संख्या में पुनरावृत्तियों के लिए itertools.chain(*iterables) और itertools.chain.from_iterable(iterables) समान प्रदर्शन करते हैं।

from_iterables का मुख्य लाभ बड़े (संभावित अनंत) संख्याओं को संभालने की क्षमता में निहित है क्योंकि उन सभी को कॉल के समय उपलब्ध नहीं होने की आवश्यकता है।

संबंधित मुद्दे