2011-11-30 12 views
6

क्या एक स्ट्रिंग को विभाजित किया जा सकता है और कुछ शब्दों को पायथन में एक ट्यूपल में असाइन किया जा सकता है। उदाक्या पाइथन में एक कथन में स्ट्रिंग को विभाजित करना और असाइन करना संभव है?

a = "Jack and Jill went up the hill" 
    (user1 , user2) = a.split().pick(1,3) #picks 1 and 3 element in the list. 

इस तरह के एक एक लाइनर संभव है? यदि ऐसा है तो वाक्यविन्यास क्या है।

+0

क्या आपका मतलब है कि आपको विभाजन के बाद 'ए' चर को रखने की आवश्यकता है? – BoltClock

+1

हम्म, हर कोई आपको 1 और 3 के बजाय तत्व 0 और 2 के लिए समाधान दे रहा है। बस एक अजीब अवलोकन :) –

+0

मेरा मतलब चर को रखने का नहीं है। – sheki

उत्तर

13

आप कल्पना प्राप्त करना चाहते हैं, तो आप operator.itemgetter इस्तेमाल कर सकते हैं:

वापसी एक प्रतिदेय उद्देश्य यह है कि इसकी संकार्य संकार्य के __getitem__() विधि का उपयोग करने से आइटम को हासिल करेगा। यदि एकाधिक आइटम निर्दिष्ट हैं, तो लुकअप मानों का एक टुपल लौटाता है।

उदाहरण:

>>> from operator import itemgetter 
>>> pick = itemgetter(0, 2) 
>>> pick("Jack and Jill went up the hill".split()) 
('Jack', 'Jill') 

या एक एक लाइनर के रूप में (w/आयात ओ):

>>> user1, user2 = itemgetter(0, 2)("Jack and Jill went up the hill".split()) 
+0

नाइस (और मुझे कुछ सिखाया जो मुझे नहीं पता था)! फिर भी, आयात कथन एक लाइनर नहीं है ... लेकिन दो! ;) – mac

1

पहले कि मेरे दिमाग में आता है:

>>> a = "Jack and Jill went up the hill" 
>>> [e for n, e in enumerate(a.split()) if n in (0, 2)] 
['Jack', 'Jill'] 

मामले में आप आश्चर्य: enumerate पहला तत्व के रूप में एक प्रगतिशील संख्या और दूसरी के रूप में प्रगणित iterable का एक तत्व के साथ tuples उत्पन्न करता है।

संपादित करें: रूप @kindall द्वारा टिप्पणी में कहा, अंतिम चरण होगा:

>>> user1, user2 = [e for n, e in enumerate(a.split()) if n in (0, 2)] 
>>> user1 
'Jack' 
>>> user2 
'Jill' 

लेकिन मैं सिर्फ उदाहरण बात करने के लिए और अधिक रखने के लिए काम करने के लिए नहीं चुना है (यदि खेद यह किसी को भ्रमित कर दिया)।

+0

यह एक सूची समझ है। वह एक ट्यूपल चाहता है। (मुझे लगता है कि इसे एक साधारण कलाकार के साथ संबोधित किया जा सकता है, हालांकि ...) – BoltClock

+2

पूछताछ के लिए बिंदुओं को जोड़ने के लिए: 'user1, user2 = (ई के लिए ई, ई में enumerate (a.split()) अगर n में (0, 2)) 'नहीं, उन्होंने किसी भी अनुक्रम के साथ एक टुपल, एकाधिक असाइनमेंट कार्यों के लिए नहीं पूछा, यहां तक ​​कि जनरेटर अभिव्यक्ति भी।) – kindall

6

आप इस

a = "Jack and Jill went up the hill" 
user1, _, user2, _ = a.split(" ", 3) 

की तरह कुछ कर सकते हैं जहां _ मतलब है कि हम मूल्य की परवाह नहीं है, और split(" ", 3) 4 क्षेत्रों में स्ट्रिंग अलग हो गए।

+1

इंजेनिअस ... यदि आप केवल 1024 वें तत्व चाहते हैं तो यह अच्छी तरह से स्केल नहीं करता है हालांकि आपकी सूची! ;) – mac

2

मैं नहीं बल्कि दो पंक्तियों में ऐसा चाहते हैं, लेकिन यहां एक एक लाइनर है:

user1, user2 = [token for (i, token) in enumerate(a.split()) if i in (0, 2)]

यहाँ मैं (बस पठनीयता और कीड़े को शुरू करता है, तो जरूरत है होना करने के लिए की संभावना उतनी ही कम के लिए बजाय क्या करेंगे है भविष्य में बदल गया)।

tokens = a.split() 
user1 = tokens[0] 
user2 = tokens[2] 
+0

यह मूल रूप से मेरा जवाब है ... मेरी पोस्ट के 2 मिनट बाद। :( – mac

+0

क्यों फ्राउन? आपने दौड़ जीती :) –

2

स्लाइसिंग एक कदम पैरामीटर

a = "Jack and Jill went up the hill" 
(user1 , user2) = a.split()[0:4:2] #picks 1 and 3 element in the list 

लेकिन जब समर्थन करता है पाइथन में फंकी ऑनलाइनर लिखना संभव है, यह सुनिश्चित करने के लिए कि यह वें के लिए सबसे अच्छी भाषा नहीं है व्यायाम की तरह।

+0

यह केवल तभी काम करता है जब लेने वाले तत्व नियमित अंतराल पर होते हैं, है ना? – mac

+3

यदि कोई भी 2 एल्केमेंट्स चाहता है, तो वे "नियमित अंतराल" पर होंगे :-) – jsbueno

1

यह काम कर देता है:

user1, user2 = a.split()[0::2][:2]

अनुक्रम 2 में 2 से गिनती के पहले दो तत्वों उठाओ।

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

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