टी-थेल्स की सूची से एन-वें तत्वों को कैसे निकालें?


112

मैं t -les की सूची से n-वें तत्वों को प्राप्त करने की कोशिश कर रहा हूं।

मेरे पास कुछ है:

elements = [(1,1,1),(2,3,7),(3,5,10)]

मैं सूची में प्रत्येक टपल के केवल दूसरे तत्वों को निकालना चाहता हूं:

seconds = [1, 3, 5]

मुझे पता है कि यह एक forलूप के साथ किया जा सकता है, लेकिन मैं जानना चाहता था कि क्या कोई दूसरा तरीका है क्योंकि मेरे पास हजारों ट्यूपल्स हैं।

जवाबों:



34

यह भी काम करता है:

zip(*elements)[1]

(मैं मुख्य रूप से यह पोस्ट कर रहा हूं, अपने आप को साबित करने के लिए कि मैंने कमर कस ली है zip...)

इसे कार्रवाई में देखें:

>>> help(zip)

मॉड्यूल में निर्मित समारोह जिप पर सहायता निर्मित :

ज़िप (...)

zip (seq1 [, seq2 [...]]) -> [(seq1 [0], seq2 [0] ...), ((...)]

टपल की सूची लौटाएँ, जहाँ प्रत्येक टपल में प्रत्येक तर्क क्रम से i-th तत्व होता है। लौटी हुई सूची को सबसे छोटे तर्क अनुक्रम की लंबाई में लंबाई में छोटा किया गया है।

>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> zip(*elements)
[(1, 2, 3), (1, 3, 5), (1, 7, 10)]
>>> zip(*elements)[1]
(1, 3, 5)
>>>

आज के दिन मैंने जो कुछ सीखा है: *listएक फ़ंक्शन के लिए एक पैरामीटर सूची बनाने के लिए तर्कों में उपयोग करें ...

नोट : पायथन 3 में, zipएक पुनरावृत्तिकर्ता लौटाता है, इसलिए इसके बजाय list(zip(*elements))ट्यूपल्स की सूची वापस करने के लिए उपयोग करें।


2
और **dictकीवर्ड तर्क बनाने के लिए उपयोग करें: def test(foo=3, bar=3): return foo*barतबd = {'bar': 9, 'foo'=12}; print test(**d)
वेन वर्नर

@Wayne वर्नर: हां। यह सब कुछ सिर्फ निष्क्रिय ज्ञान था (मैं अक्सर इसका इस्तेमाल नहीं करता) - लेकिन यह अब याद दिलाया जाना अच्छा है और इसलिए आप जानते हैं कि कहां / क्या देखना है ...
डैरन थॉमस

1
सच्ची कहानी - मुझे लगता है कि कुछ भी में मैं अक्सर पर्याप्त का उपयोग करें (अजगर, vim), मैं साफ / शांत की जरूरत अनुस्मारक के लिए करते हैं सुविधाओं है कि मैं भूल गया हूँ क्योंकि मैं उन्हें का उपयोग नहीं करते कि अक्सर।
वेन वर्नर

* सूची वाक्यविन्यास बहुत उपयोगी है। किसी भी विचार जहां यह आधिकारिक अजगर प्रलेखन में वर्णित है?
user1748155

मैंने इसे केवल ट्यूटोरियल में पाया: docs.python.org/2/tutorial/…
डैरन थॉमस

30

मुझे पता है कि यह एक के साथ किया जा सकता है, लेकिन मैं जानना चाहता था कि क्या कोई और तरीका है

एक और तरीका है। आप इसे मैप और आइटमगेटर के साथ भी कर सकते हैं :

>>> from operator import itemgetter
>>> map(itemgetter(1), elements)

यह अभी भी आंतरिक रूप से एक लूप प्रदर्शन करता है और यह सूची समझ से थोड़ा धीमा है:

setup = 'elements = [(1,1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))

परिणाम:

विधि 1: 1.25699996948
विधि 2: 1.46600008011

यदि आपको किसी सूची पर पुनरावृति करने की आवश्यकता है, तो एक forका उपयोग करना ठीक है।


2
एक छोटा सा जोड़: पायथन-3.x में बेंचमार्क यह दिखाएगा कि नक्शा केवल एक मिलीसेकंड का एक अंश लेता है। ऐसा इसलिए है क्योंकि यह एक पुनरावृत्ती लौटाएगा। Method2 = 'सूची (नक्शा (आइटमगेटर (1), तत्व))' पुराने व्यवहार का प्रतिपादन करता है।
माईक बेकमैन

12

यह पाया गया क्योंकि मैं खोज रहा था कि 2-ट्यूपल सूची के दूसरे तत्व को खींचने के लिए कौन सा तरीका सबसे तेज़ है। नहीं, जो मैं चाहता था, लेकिन उसी तरीके से दौड़ा, जैसा कि थ्री मेथड के साथ दिखाया गया है

setup = 'elements = [(1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'
method3 = 'dict(elements).values()'
method4 = 'zip(*elements)[1]'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup)
print('Method 3: ' + str(t.timeit(100)))
t = timeit.Timer(method4, setup)
print('Method 4: ' + str(t.timeit(100)))

Method 1: 0.618785858154
Method 2: 0.711684942245
Method 3: 0.298138141632
Method 4: 1.32586884499

तो दो बार उपवास के रूप में अगर आपके पास सिर्फ एक तानाशाही में बदलने के लिए और मूल्यों को लेने के लिए 2 टुपल जोड़ी है।


यह संभवत: स्पष्ट है, लेकिन मैं उल्लेख करता हूं कि dict(elements).values()सूची-निर्माण या मानचित्र के विपरीत एक-तत्व का परिणाम होगा। यह वही है जो मैं चाहता था (मैं अद्वितीय टौउन्स में रुचि रखता था) (+1 और पोस्ट करने के लिए बड़ा धन्यवाद) लेकिन अन्य लोग आश्चर्यचकित हो सकते हैं कि तानाशाह क्यों तेज है - यह मेमोरी आवंटित नहीं कर रहा है, बल्कि केवल मौजूदा तत्व के खिलाफ जांच कर रहा है।
ग्रेग्री

6

2-ट्यूपल सूची से दूसरा तत्व निकालने के लिए पायथन 3.6 के लिए समय।

इसके अलावा, जोड़ा numpyविधि, जो पढ़ने के लिए सरल है (लेकिन सूची समझ की तुलना में यकीनन सरल)।

from operator import itemgetter
elements = [(1,1) for _ in range(100000)]

%timeit second = [x[1] for x in elements]
%timeit second = list(map(itemgetter(1), elements))
%timeit second = dict(elements).values()
%timeit second = list(zip(*elements))[1]
%timeit second = np.array(elements)[:,1]

और समय:

list comprehension:  4.73 ms ± 206 µs per loop
list(map):           5.3 ms ± 167 µs per loop
dict:                2.25 ms ± 103 µs per loop
list(zip)            5.2 ms ± 252 µs per loop
numpy array:        28.7 ms ± 1.88 ms per loop

ध्यान दें कि map()और zip()अब एक सूची वापस न करें, इसलिए स्पष्ट रूपांतरण।



1

उपयोग करना isliceऔर chain.from_iterable:

>>> from itertools import chain, islice
>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> list(chain.from_iterable(islice(item, 1, 2) for item in elements))
[1, 3, 5]

यह तब उपयोगी हो सकता है जब आपको एक से अधिक तत्वों की आवश्यकता हो:

>>> elements = [(0, 1, 2, 3, 4, 5), 
                (10, 11, 12, 13, 14, 15), 
                (20, 21, 22, 23, 24, 25)]
>>> list(chain.from_iterable(islice(tuple_, 2, 5) for tuple_ in elements))
[2, 3, 4, 12, 13, 14, 22, 23, 24]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.