[] और {} बनाम सूची () और तानाशाही (), जो बेहतर है?


113

मैं समझता हूं कि वे दोनों अनिवार्य रूप से एक ही चीज हैं, लेकिन शैली के संदर्भ में, जो एक खाली सूची या तानाशाही बनाने के लिए उपयोग करने के लिए बेहतर (अधिक पायथोनिक) है?

जवाबों:


197

गति के संदर्भ में, यह खाली सूची / डिट्स के लिए कोई प्रतियोगिता नहीं है:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

और गैर-खाली के लिए:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267

इसके अलावा, ब्रैकेट नोटेशन का उपयोग करने से आप सूची और शब्दकोश समझ का उपयोग कर सकते हैं, जो पर्याप्त कारण हो सकता है।


4
डिक्ट और लिस्ट कॉम्प्रिहेंशन को अंग्रेजी नामों के साथ भी इस्तेमाल किया जा सकता है। उदाहरण:list(i for i in range(10) if i % 2)
जग्स

4
क्या कोई कारण है कि {} और [] इतनी तेजी से बढ़ रहे हैं? मैंने सोचा था कि वे बस उपनाम थे।
जस्टिन डी।

सही समय देने के लिए समय नहीं लगता है। बेंचमार्क के अनुसार, यह ~ 200ms लगता है जो सामान्य http कॉल की तुलना में धीमा है। शेल में सामान्य रूप से रनिंग () और फिर टाइमिट ("तानाशाही") चलाने की कोशिश करें, आपको निष्पादन में स्पष्ट अंतर दिखाई देगा।
पीयूष

2
@ पियूष वास्तव में, timeit()फ़ंक्शन एक निर्दिष्ट संख्या में पुनरावृत्तियों को निष्पादित करने के लिए कुल समय की रिपोर्ट करता है, जो 1000000डिफ़ॉल्ट रूप से है। तो ऊपर दिए गए उदाहरण एक लाख बार कोड स्निपेट को चलाने के लिए सेकंड की संख्या हैं। उदाहरण के लिए timeit('dict()', number=1) // -> 4.0531158447265625e-06(एक पुनरावृत्ति) जबकि timeit('dict()') // -> 0.12412905693054199(एक लाख पुनरावृत्तियों)
ग्रेग Haskins

@GregHaskins तो उस मामले में, मुझे नहीं लगता है कि किसी को भी हुकुम () या {} का उपयोग करने के बारे में चिंता करनी चाहिए, जब तक कि एक लाख रिकॉर्ड के माध्यम से लूपिंग और लूप में तानाशाही () का उपयोग न करें।
पीयूष

37

मेरी राय में []और {}खाली सूची / dicts बनाने के लिए सबसे अधिक पायथोनिक और पठनीय तरीके हैं।

set()हालांकि, उदाहरण के लिए सावधान रहें :

this_set = {5}
some_other_set = {}

भ्रामक हो सकता है। पहला एक तत्व के साथ एक सेट बनाता है, दूसरा एक खाली ताना बनाता है, एक सेट नहीं


4
{}हमेशा एक खाली ताना बनाता है। {1,2,3}2.7+ में एक सेट बनाता है, लेकिन 2.6पुराने संस्करणों में एक वाक्यविन्यास त्रुटि है ।
ThiefMaster

1
माफ़ करना? यह नाम के साथ एक चर है some_epic_setजो एक खाली dictवस्तु की ओर इशारा कर रहा है ... यह एक खाली सेट नहीं है। एक खाली सेट के लिए आपको उपयोग करने की आवश्यकता है set()
6502

2
@ 6502: वास्तव में, लेकिन यह एक सामान्य नुकसान है जो {5}एक तत्व के साथ एक सेट बनाता है, 5और {}एक खाली ताना है।
orlp

1
वाह, यह भ्रामक था। फिर भी, यह भ्रामक के खराब डिजाइन स्तर का फ्रैक्टल नहीं है। :-)
प्रो। फ़ॉकन

4
@EnderLook: वास्तव में, सामान्यीकृत अनपैकिंग के साथ , आप शाब्दिक वाक्य रचना के साथ {*()}एक रिक्त बनाने के लिए उपयोग कर सकते हैं set। मैं इसे वन-आई बंदर ऑपरेटर कहता हूं। :-)
शैडो रेंजर

17

जैसा कि इसके बाइटकोड से छोटा होता है , तानाशाह का शब्द थोड़ा छोटा हो सकता है:

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

वही listबनाम पर लागू होता है[]


8
यह मानता है कि BUILD_MAP और LOAD_GLOBAL निरंतर समय हैं और समान समय लेते हैं। लगभग नामुमकिन। timeit बहुत बेहतर अनुमान देता है।
जेमी पाटे

अधिक संभावना है, CALL_FUNCTIONलेता है कम से कम ज्यादा समय के रूप में के रूप में BUILD_MAP(समारोह अनिवार्य रूप से बुलाया जा रहा है BUILD_MAP), और LOAD_GLOBALले जाता है सिर्फ अतिरिक्त भूमि के ऊपर है।
शेपनर

3

IMHO, अपने पायथन का उपयोग करके list()और dict()सी। ऊग की तरह दिखता है।


3

[] और सूची () के बीच अंतर के मामले में, एक ऐसी गड़बड़ी है कि मैंने किसी और को इंगित नहीं किया है। यदि आप सूची के सदस्य के रूप में एक शब्दकोश का उपयोग करते हैं, तो दोनों पूरी तरह से अलग परिणाम देंगे:

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 

आप [foo_dict]का उपयोग करके के रूप में एक ही परिणाम प्राप्त कर सकते हैं list((foo_dict,))list()विधि के रूप में यह केवल पैरामीटर और दोहराता यह सूची तत्वों को जोड़ने के खत्म हो गया एक iterable लेता है। ऐसा करने से एक समान नुकसान होगा list(some_list)जो सूची को समतल कर देगा।
sotrh

1

सूची () और [] अलग तरीके से काम करें:

>>> def a(p=None):
...     print(id(p))
... 
>>> for r in range(3):
...     a([])
... 
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
...     a(list())
... 
139969725367296
139969725367552
139969725367616

सूची () हमेशा ढेर में नई वस्तु बनाते हैं, लेकिन [] कई कारणों से मेमोरी सेल का पुन: उपयोग कर सकते हैं।


0

नीचे दिए गए उदाहरण के रूप में [] और सूची () के बीच व्यवहार में एक अंतर है। यदि हम चाहते हैं कि सूची की संख्या का उपयोग किया जाए, तो हमें एक मैप ऑब्जेक्ट मिलेगा! हालांकि यह कैसे समझा जाए, इस पर कोई यकीन नहीं है।

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int

यहाँ रेंज () फंक्शन >>> प्रिंट (रेंज (10)) # रेंज (0, 10) रेंज () के उदाहरण का उपयोग करके व्यवहार की व्याख्या प्रतीत होती है, लेकिन यह एक सूची की तरह है। यह एक ऐसी वस्तु है जो एक क्रम से क्रमिक वस्तुओं को लौटाता है जब आप इस पर पुनरावृति करते हैं, तो यह वास्तव में सूची नहीं बनाता है, अंतरिक्ष की बचत करता है। इस तरह की एक वस्तु चलने योग्य है, जो कि कार्यों के लिए एक लक्ष्य के रूप में उपयुक्त है और निर्माण से कुछ उम्मीद है जो वे आपूर्ति समाप्त होने तक लगातार आइटम प्राप्त कर सकते हैं। फ़ंक्शन सूची () पुनरावृत्तियों से सूची बनाती है: >>> सूची (श्रेणी (5)) # [0, 1, 2, 3, 4]
sebtac

1
परिणाम यह है कि [] संग्रहणीय वस्तु को संग्रहीत करता है; सूची () उसी पुनरावृत्ति से सूची बनाता है
sebtac

0

एक बॉक्स ब्रैकेट जोड़ी एक सूची ऑब्जेक्ट या एक इंडेक्स सबस्क्रिप्ट, my_List [x] को दर्शाती है।

एक घुंघराले ब्रेस जोड़ी एक शब्दकोश वस्तु को दर्शाता है।

a_list = ['पर', 'बंद', 1, 2]

a_dict = {on: 1, बंद: 2}


-5

यह मुख्य रूप से ज्यादातर समय पसंद का मामला है। यह वरीयता की बात है।

नोट करें कि यदि आपके पास उदाहरण के लिए संख्यात्मक कुंजियाँ हैं, तो आप ऐसा नहीं कर सकते:

mydict = dict(1="foo", 2="bar")

आप को करना पड़ेगा:

mydict = {"1":"foo", "2":"bar"}

7
यह गलत है ... आपको mydict = {1:"foo", 2:"bar"}(कुंजियों के लिए उद्धरण के बिना) करने की आवश्यकता है।
6502

8
यह केवल "गलत" नहीं है। कुंजियाँ स्ट्रिंग / इनट्स पर निर्भर करती हैं कि आप उन्हें उद्धृत करते हैं या नहीं।
ThiefMaster
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.