2010-03-24 3 views
69

ठीक है मुझे पाइथन के zip() फ़ंक्शन से प्यार है। इसे हर समय इस्तेमाल करें, यह शानदार है। हर बार मैं zip() के विपरीत करना चाहता हूं, सोचो "मुझे यह पता था कि यह कैसे करना है", फिर Google पायथन अनजिप करें, फिर याद रखें कि कोई इस जादुई * का उपयोग टुपल्स की ज़िप्ड सूची को अनजिप करने के लिए करता है। इस तरह:क्यों x, y = ज़िप (* ज़िप (ए, बी)) पायथन में क्यों काम करता है?

x = [1,2,3] 
y = [4,5,6] 
zipped = zip(x,y) 
unzipped_x, unzipped_y = zip(*zipped) 
unzipped_x 
    Out[30]: (1, 2, 3) 
unzipped_y 
    Out[31]: (4, 5, 6) 

पृथ्वी पर क्या चल रहा है? वह जादुई तारांकन क्या कर रहा है? इसे और कहां लागू किया जा सकता है और पाइथन में अन्य अद्भुत भयानक चीजें इतनी रहस्यमय और Google के लिए कठिन हैं?

+2

डुप्लिकेट: http://stackoverflow.com/questions/2233204/how-does-zipitersn-work-in-python –

+3

ओह, हाँ। यह वास्तव में समस्या है, हालांकि, ज़िप के लिए स्टैक ओवरफ्लो खोजना (* 'पायथन पहले पृष्ठ पर डुप्लिकेट प्रश्न नहीं लौटाता है, और 'पायथन *' या 'पायथन ज़िप' के लिए googling (*' मुझे लगता है कि बहुत अधिक वापस नहीं आता है क्योंकि '(*' को नजरअंदाज कर दिया गया है? आप सही हैं, किसी और ने यह भी सोचा कि यह बहुत ही अच्छा था। क्या मुझे प्रश्न हटा देना चाहिए? –

+1

मैं इसे हटा नहीं दूंगा, क्योंकि यह किसी कारण से खोज में अधिक है। इसे बंद करना यह एक रीडायरेक्ट के रूप में काम करने के लिए। –

उत्तर

35

पायथन में तारांकन को Unpacking Argument Lists के तहत पाइथन ट्यूटोरियल में दस्तावेज किया गया है।

18

तारांकन apply (जैसा कि यह लिस्प और योजना में जाना जाता है) करता है। असल में, यह आपकी सूची लेता है, और फ़ंक्शन को उस सूची की सामग्री के साथ तर्क के रूप में कॉल करता है।

+1

पायथन 2 श्रृंखला में अभी भी एक है 'लागू करें' समारोह, लेकिन मुझे वहां नहीं लगता है ऐसे किसी भी उपयोग के मामले हैं जिन्हें '*' द्वारा कवर नहीं किया जा सकता है। मेरा मानना ​​है कि इसे पायथन 3 –

+1

@gnibbler से हटा दिया गया है: पुष्टि की गई। 'लागू' http://www.hthon.org/dev/peps/pep-0361/ पर सूचीबद्ध है, शीर्षक के तहत ~ Py3k में हटाई गई सुविधाओं के लिए चेतावनी: ' – MatrixFrog

+2

लागू केवल तभी मौजूद है क्योंकि तारांकन बाद में जोड़ा गया था। – DasIch

8

यह भी कई आर्ग के लिए उपयोगी होता है:

def foo(*args): 
    print args 

foo(1, 2, 3) # (1, 2, 3) 

# also legal 
t = (1, 2, 3) 
foo(*t) # (1, 2, 3) 

और, आप कीवर्ड तर्कों और शब्दकोशों के लिए डबल तारांकन उपयोग कर सकते हैं:

def foo(**kwargs): 
    print kwargs 

foo(a=1, b=2) # {'a': 1, 'b': 2} 

# also legal 
d = {"a": 1, "b": 2} 
foo(**d) # {'a': 1, 'b': 2} 

और निश्चित रूप से, आप इन गठजोड़ कर सकते हैं:

def foo(*args, **kwargs): 
    print args, kwargs 

foo(1, 2, a=3, b=4) # (1, 2) {'a': 3, 'b': 4} 

सुंदर साफ और उपयोगी सामान।

6

यह हमेशा काम नहीं करता:

>>> x = [] 
>>> y = [] 
>>> zipped = zip(x, y) 
>>> unzipped_x, unzipped_y = zip(*zipped) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 0 values to unpack 

ऊप्स! मैं यह काम कर में डराने के लिए एक खोपड़ी की आवश्यकता है:

>>> unzipped_x, unzipped_y = zip(*zipped) or ([], []) 
>>> unzipped_x 
[] 
>>> unzipped_y 
[] 

python3 में मैं आप

>>> unzipped_x, unzipped_y = tuple(zip(*zipped)) or ([], []) 

की जरूरत के बाद से जिप अब एक जनरेटर समारोह जो झूठी-y नहीं है देता है लगता है।

+0

या ज़ेड में ज़ेड के लिए केवल जेनरेटर 'unzipped_x = (z [0] का उपयोग करें)'। यदि 'ज़िप्ड' स्वयं जनरेटर है तो इसे पहले सूची में रूपांतरित करें ताकि आप 'unzipped_y' के लिए फिर से फिर से चालू हो सकें। 'ज़िप (* ज़िपित) बनाम कोई अतिरिक्त लागत नहीं है क्योंकि उत्तरार्द्ध तर्कों को अनपॅक करने की प्रक्रिया में 'ज़िप' को एक सूची में परिवर्तित करता है। –

0

@ bcherry के जवाब देने के लिए परिशिष्ट:

>>> def f(a2,a1): 
... print a2, a1 
... 
>>> d = {'a1': 111, 'a2': 222} 
>>> f(**d) 
222 111 

तो यह सिर्फ कीवर्ड तर्क के साथ नहीं काम करता है (this strict sense में), लेकिन नाम तर्क भी (उर्फ स्थितीय तर्क) के साथ।

2

मैं पाइथन के लिए बेहद नया हूं इसलिए हाल ही में मुझे हाल ही में फिसल गया, लेकिन इसे उदाहरण के साथ प्रस्तुत किया गया और किस पर जोर दिया गया था इसके साथ और अधिक करना पड़ा।

ज़िप कॉल को समझने में मुझे समस्याएं क्या थीं, ज़िप कॉल रिटर्न वैल्यू के संचालन में असमानता थी। यही है, जब ज़िप को पहली बार बुलाया जाता है, तो वापसी मान को एक चर के लिए असाइन किया जाता है, जिससे एक सूची संदर्भ (निर्मित टुपल सूची युक्त) बनाते हैं। दूसरी कॉल में, यह पाइथन की एक सूची (या संग्रह?) वापसी मूल्य को कई चर संदर्भों में स्वचालित रूप से अनपैक करने की क्षमता का लाभ उठा रहा है, प्रत्येक संदर्भ व्यक्तिगत टुपल है। अगर कोई पाइथन में काम करने से परिचित नहीं है, तो यह वास्तव में क्या हो रहा है के रूप में खो जाना आसान बनाता है।

>>> x = [1, 2, 3] 
>>> y = "abc" 
>>> zipped = zip(x, y) 
>>> zipped 
[(1, 'a'), (2, 'b'), (3, 'c')] 
>>> z1, z2, z3 = zip(x, y) 
>>> z1 
(1, 'a') 
>>> z2 
(2, 'b') 
>>> z3 
(3, 'c') 
>>> rezipped = zip(*zipped) 
>>> rezipped 
[(1, 2, 3), ('a', 'b', 'c')] 
>>> rezipped2 = zip(z1, z2, z3) 
>>> rezipped == rezipped2 
True