बार-बार एन एकल आइटम की सूची बनाएं


522

मैं सूचियों की एक श्रृंखला बनाना चाहता हूँ, सभी की लंबाई अलग-अलग है। प्रत्येक सूची में एक ही तत्व होगा e, बार- nबार (जहां n= सूची की लंबाई)।

मैं [e for number in xrange(n)]प्रत्येक सूची के लिए सूची समझ का उपयोग किए बिना सूची कैसे बना सकता हूं ?

जवाबों:


777

आप यह भी लिख सकते हैं:

[e] * n

आपको ध्यान देना चाहिए कि यदि ई उदाहरण के लिए एक खाली सूची है, तो आपको उसी सूची के n संदर्भ के साथ एक सूची मिलती है, न कि स्वतंत्र खाली सूची।

प्रदर्शन का परीक्षण

पहली नज़र में ऐसा लगता है कि एन समान तत्वों के साथ सूची बनाने के लिए दोहराना सबसे तेज़ तरीका है:

>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819

लेकिन रुको - यह एक निष्पक्ष परीक्षा नहीं है ...

>>> itertools.repeat(0, 10)
repeat(0, 10)  # Not a list!!!

फ़ंक्शन itertools.repeatवास्तव में सूची नहीं बनाता है, यह सिर्फ एक ऑब्जेक्ट बनाता है जिसका उपयोग यदि आप चाहें तो एक सूची बनाने के लिए किया जा सकता है! आइए फिर से कोशिश करें, लेकिन एक सूची में परिवर्तित करना:

>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233

इसलिए यदि आप एक सूची चाहते हैं, तो उपयोग करें [e] * n। यदि आप तत्वों को आलसी उत्पन्न करना चाहते हैं, तो उपयोग करें repeat


23
यह अत्यधिक संभावना नहीं है कि समान तत्वों के साथ एक सूची बनाने का प्रदर्शन एक अजगर कार्यक्रम के प्रदर्शन का एक महत्वपूर्ण घटक होगा।
आर्थर

11
जैसा कि ऊपर उल्लेख किया गया है, अगर ई एक खाली सूची है तो [[]] * nअप्रत्याशित परिणाम उत्पन्न कर सकते हैं। अद्वितीय रिक्त उप-सूचियाँ बनाने के लिए, समझ के लिए उपयोग करें:[[] for i in range(0,n)]
जोशियाह योडर

149
>>> [5] * 4
[5, 5, 5, 5]

जब आइटम दोहराई जा रही है तो एक सूची है। सूची को क्लोन नहीं किया जाएगा: सभी तत्व एक ही सूची को संदर्भित करेंगे!

>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]

80

पायथन में बार-बार एकल आइटम की सूची बनाएँ

अपरिवर्तनीय वस्तुएँ

अपरिवर्तनीय वस्तुओं के लिए, जैसे कोई नहीं, बूल, इन्टस, फ्लोट्स, स्ट्रिंग्स, ट्यूपल्स या फ्रोज़ेन्सेट्स, आप इसे इस तरह से कर सकते हैं:

[e] * 4

ध्यान दें कि यह केवल सूची में अपरिवर्तनीय वस्तुओं (स्ट्रिंग्स, ट्यूपल्स, फ्रोज़ेन्सेट्स) के साथ उपयोग किया जाता है, क्योंकि वे सभी एक ही वस्तु को स्मृति में एक ही स्थान पर इंगित करते हैं। मैं अक्सर इसका उपयोग करता हूं जब मुझे सभी तारों के स्कीमा के साथ एक तालिका बनानी होती है, ताकि मुझे एक से एक मैपिंग के लिए अतिरेक न देना पड़े।

schema = ['string'] * len(columns)

म्यूटेबल आइटम

मैंने अब लंबे समय तक पायथन का उपयोग किया है, और मैंने कभी भी एक उपयोग-मामला नहीं देखा है जहां मैं एक उत्परिवर्ती उदाहरण के साथ ऊपर करूंगा। इसके बजाय, कहने के लिए, एक उत्परिवर्ती खाली सूची, सेट, या तानाशाही, आपको कुछ ऐसा करना चाहिए:

list_of_lists = [[] for _ in columns]

इस संदर्भ में अंडरस्कोर बस एक फेंकने योग्य परिवर्तनशील नाम है।

यदि आपके पास केवल संख्या है, तो यह होगा:

list_of_lists = [[] for _ in range(4)]

यह _वास्तव में विशेष नहीं है, लेकिन आपकी कोडिंग पर्यावरण शैली चेकर शायद शिकायत करेगा यदि आप चर का उपयोग करने और किसी अन्य नाम का उपयोग करने का इरादा नहीं करते हैं।


उत्परिवर्तनीय वस्तुओं के साथ अपरिवर्तनीय विधि का उपयोग करने के लिए:

परिवर्तनशील वस्तुओं के साथ ऐसा करने से सावधान रहें , जब आप उनमें से किसी एक को बदलते हैं, तो वे सभी बदल जाते हैं क्योंकि वे सभी एक ही वस्तु हैं:

foo = [[]] * 4
foo[0].append('x')

फू अब रिटर्न:

[['x'], ['x'], ['x'], ['x']]

लेकिन अपरिवर्तनीय वस्तुओं के साथ, आप इसे काम कर सकते हैं क्योंकि आप संदर्भ बदलते हैं, न कि वस्तु:

>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]

>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]

लेकिन फिर से, उत्परिवर्तित वस्तुएं इसके लिए अच्छी नहीं हैं, क्योंकि इन-प्लेस ऑपरेशंस ऑब्जेक्ट को बदलते हैं, संदर्भ नहीं:

l = [set()] * 4
>>> l[0] |= set('abc')    
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]

26

Itertools के लिए बस एक समारोह है:

import itertools
it = itertools.repeat(e,n)

बेशक itertoolsआपको एक सूची के बजाय एक पुनरावृत्ति देता है। [e] * nआपको एक सूची देता है, लेकिन, आप उन अनुक्रमों के साथ क्या करेंगे, इसके आधार पर, itertoolsसंस्करण बहुत अधिक कुशल हो सकता है।


13

जैसा कि अन्य लोगों ने बताया है कि, एक परिवर्तनशील वस्तु के लिए * ऑपरेटर का उपयोग करना संदर्भों को दोहराता है, इसलिए यदि आप एक को बदलते हैं तो आप उन सभी को बदलते हैं। यदि आप एक परिवर्तनशील वस्तु के स्वतंत्र उदाहरण बनाना चाहते हैं, तो आपका xrange सिंटैक्स ऐसा करने का सबसे पाइथोनिक तरीका है। यदि आप एक नामांकित चर होने से परेशान हैं जिसका उपयोग कभी नहीं किया जाता है, तो आप अनाम अंडरस्कोर चर का उपयोग कर सकते हैं।

[e for _ in xrange(n)]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.