फ़ंक्शन कॉल में तारांकन चिह्न


111

मैं itertools.chain का उपयोग इस प्रकार से सूचियों की सूची "समतल" करने के लिए कर रहा हूँ:

uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

यह कहने से अलग कैसे है:

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))

8
अधिक जानकारी के लिए पायथन डॉक्स में अनपैकिंग तर्क सूचियों पर एक नज़र डालें ।
काई

8
आपको **ऑपरेटर को भी देखना चाहिए - यह वही काम करता है जो *कीवर्ड तर्क के साथ होता है।
सीन विएरा

जवाबों:


181

* "स्पैट" ऑपरेटर है: यह एक सूची को इनपुट के रूप में लेता है, और इसे फ़ंक्शन कॉल में वास्तविक स्थिति संबंधी तर्कों में विस्तारित करता है।

तो अगर uniqueCrossTabsथा [ [ 1, 2 ], [ 3, 4 ] ], तो itertools.chain(*uniqueCrossTabs)जैसा कह रहा है वैसा ही हैitertools.chain([ 1, 2 ], [ 3, 4 ])

यह स्पष्ट रूप से सिर्फ पास होने से अलग है uniqueCrossTabs। आपके मामले में, आपके पास उन सूचियों की एक सूची है जिन्हें आप समतल करना चाहते हैं; itertools.chain()आपके द्वारा पास किए जाने वाले सभी स्थितीय तर्कों के संघटन पर एक पुनरावर्तक को क्या लौटाता है, जहाँ प्रत्येक स्थितीय तर्क अपने आप में पुनरावृत्त होता है।

दूसरे शब्दों में, आप प्रत्येक सूची uniqueCrossTabsको एक तर्क के रूप में पास करना चाहते हैं chain(), जो उन्हें एक साथ श्रृंखला देगा, लेकिन आपके पास अलग-अलग चर में सूचियां नहीं हैं, इसलिए आप *सूची की सूची को कई सूची तर्क में विस्तारित करने के लिए ऑपरेटर का उपयोग करते हैं ।

जैसा कि जोचेन रिट्जेल ने टिप्पणियों में बताया है, chain.from_iterable()इस ऑपरेशन के लिए बेहतर अनुकूल है, क्योंकि यह शुरू करने के लिए पुनरावृत्तियों के एकल चलने योग्य मानता है। आपका कोड तो बस हो जाता है:

uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))

9
@larsmans: मुझे लगता है कि यह शब्द रूबी दुनिया में अधिक लोकप्रिय है, लेकिन यह पायथन के लिए भी स्वीकार्य लगता है क्योंकि मुझे यह पसंद है क्योंकि यह कहने के लिए मजेदार है ;-)
कैमरन

1
@ लार्समैन: दिलचस्प! मैंने हमेशा सोचा कि यह सूची को तर्क सूची में बदलने की कार्रवाई के लिए संदर्भित है, न कि वास्तविक चरित्र के रूप में।
कैमरन

1
शायद तार सबसे अच्छा उदाहरण नहीं हैं क्योंकि हर कोई तार को पुनरावृत्तियों के रूप में नहीं देखता है। Btw: इसके बजाय chain(*it)मैं लिखूंगा chain.from_iterable(it)
जोहान रिट्जेल

@ जोकेन: आप बिल्कुल सही कह रहे हैं, मैं इसकी जगह संख्याओं का उपयोग करने के लिए इसे बदल दूंगा। इसके अलावा, मैं भी from_iterableअस्तित्व में नहीं पता था! मैं इसे शीघ्र ही अपने उत्तर में जोड़ दूंगा
कैमरन

1
@ रमी: *केवल सूची को कार्य करने के लिए स्थिति संबंधी तर्कों में विस्फोट करने के लिए है (हां, बहुत विशिष्ट)। आप उन for l in uniqueCrossTabs:पर पुनरावृति कर सकते हैं । दुर्भाग्य से यह *काम पर देखना मुश्किल है क्योंकि यह केवल तभी काम करता है जब आप किसी सूची को सूची में पास कर रहे होते हैं (सूची को पहले पैरामीटर के रूप में पारित करने के बजाय, सूची में *प्रत्येक तत्व को एक अलग पैरामीटर के रूप में पारित करने का कारण बनता है, एक के बाद एक , मानो उन्हें पैरामीटर सूची में अल्पविराम द्वारा अलग कर दिया गया हो)
कैमरन

72

यह फंक्शन कॉल के लिए अलग-अलग तर्कों में अनुक्रम को विभाजित करता है।

>>> def foo(a, b=None, c=None):
...   print a, b, c
... 
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
...   print a
... 
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)

उदाहरणों के साथ पर्याप्त व्याख्या। +1!
अरुणीआरसी

28

बस अवधारणा को समझाने / उपयोग करने का एक वैकल्पिक तरीका है।

import random

def arbitrary():
    return [x for x in range(1, random.randint(3,10))]

a, b, *rest = arbitrary()

# a = 1
# b = 2
# rest = [3,4,5]

3
इस कहीं और महत्वपूर्ण है और नहीं उल्लेख किया है
गेर्शोम

1
यह उत्तर विशेष रूप से प्रश्न पर लागू नहीं होता है, लेकिन तारांकन का एक महत्वपूर्ण अनुप्रयोग है (इसलिए मुझे लगता है कि "धूमिल" शीर्षक के तहत उचित है)। एक ही नस के साथ, एक और महत्वपूर्ण अनुप्रयोग फ़ंक्शन परिभाषाओं में है: अधिक जानकारी के लिए यह उत्तरdef func(a, b, *args): देखें ।
एएसएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.