प्रत्येक सबलिस्ट का पहला आइटम निकालें


146

मैं सोच रहा हूं कि सूचियों की सूची में प्रत्येक सबलिस्ट के पहले आइटम को निकालने का सबसे अच्छा तरीका क्या है और इसे एक नई सूची में जोड़ें। तो अगर मेरे पास है:

lst = [[a,b,c], [1,2,3], [x,y,z]]

और मैं बाहर निकालना चाहता हूं a, 1और xउन लोगों से एक अलग सूची बनाना चाहता हूं ।

मैंने कोशिश की:

lst2.append(x[0] for x in lst)

1
आपका कोड लगभग सही है। केवल समस्या सूची बोध का उपयोग है।
अभिषेक मित्तल

जवाबों:


198

सूची समझ का उपयोग करना :

>>> lst = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [item[0] for item in lst]
>>> lst2
['a', 1, 'x']

सूची बोध विधि Numpy विधि की तुलना में सबसे तेज़, और भी तेज़ है। जौबी का जवाब प्रदर्शन की तुलना के बारे में बात करता है,
झांग

83

आप ज़िप का उपयोग कर सकते हैं:

>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(1, 11, 21)

या, पायथन 3 जहां zipएक सूची का उत्पादन नहीं करता है:

>>> list(zip(*lst))[0]
(1, 11, 21)

या,

>>> next(zip(*lst))
(1, 11, 21)

या, (मेरा पसंदीदा) सुन्न का उपयोग करें:

>>> import numpy as np
>>> a=np.array([[1,2,3],[11,12,13],[21,22,23]])
>>> a
array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23]])
>>> a[:,0]
array([ 1, 11, 21])

नीचे नहीं उतारा गया है लेकिन पहला कोड स्निपेट (जिप) निर्मित करता है: "'जिप' ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है"। बृहस्पति पर अजगर 3.6।
जौबी

@ जौबी: बस listइसके चारों ओर पहले लपेटो या उपयोग करें next। धन्यवाद
dawg

20

एक ही मुद्दा था और प्रत्येक समाधान के प्रदर्शन के बारे में उत्सुक था।

यहाँ है %timeit:

import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]

पहला संख्यात्मक-तरीका, सरणी बदलना:

%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

पूरी तरह से सूची समझ का उपयोग कर देशी (@alecxe द्वारा समझाया गया):

%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

उपयोग करने का एक और मूल तरीका zip(जैसा कि @dawg द्वारा समझाया गया है):

%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

दूसरा सुन्न-रास्ता। @Dawg द्वारा भी समझाया गया:

%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

हैरानी की बात है (अच्छी तरह से, कम से कम मेरे लिए) सूची समझ का उपयोग करने का मूल तरीका सबसे तेज और लगभग 10 गुना तेजी से सुन्न-रास्ता है। फाइनल के बिना दो सुन्न-तरीके से चलने से एक which के listबारे में बचत होती है जो अभी भी 10x अंतर में है।

ध्यान दें, जब मैंने कॉल करने के लिए प्रत्येक कोड स्निपेट को घेर लिया था len, यह सुनिश्चित करने के लिए कि जेनरेटर अंत तक चलते हैं, तो समय समान रहा।


4
एक सरणी बनाते समय पर्याप्त ओवरहेड होता है।
hpaulj

1
यदि आप सुन्न सरणी के साथ शुरू करते हैं, तो hpaulj से सहमत हैं, [:, 0] तेज है। इसे जाने दें: lst = np.array ([[a ',' b ',' c '], [१,२,३], [' x ',' y ',' z ']]। तब lst [:, 0]। उदाहरण समय परीक्षणों में रूपांतरण सूची को एक अनुचित लाभ देता है। इसलिए यदि आप कर सकते हैं, तो अपने डेटा को संग्रहीत करने के लिए एक संख्यात्मक सरणी का उपयोग करें यदि गति आपका अंतिम लक्ष्य है। Numpy लगभग हमेशा तेज होता है। यह गति के लिए बनाया गया है।
१३:१३

13

पायथन में आइटम को सूची में एक विशिष्ट सूचकांक में वापस करने के लिए एक आइटम कहा जाता है:

from operator import itemgetter

आइटमगेटर को पास करें () उस आइटम के इंडेक्स को कार्य करें जिसे आप पुनः प्राप्त करना चाहते हैं। पहले आइटम को पुनः प्राप्त करने के लिए, आप आइटमगेटर (0) का उपयोग करेंगे। समझने के लिए महत्वपूर्ण बात यह है कि आइटमगेटर (0) स्वयं एक फ़ंक्शन देता है। यदि आप उस फ़ंक्शन की सूची पास करते हैं, तो आपको विशिष्ट आइटम मिलता है:

itemgetter(0)([10, 20, 30]) # Returns 10

यह उपयोगी है जब आप इसे मानचित्र () के साथ जोड़ते हैं, जो एक फ़ंक्शन को उसके पहले तर्क के रूप में लेता है, और दूसरे तर्क के रूप में एक सूची (या किसी अन्य चलने योग्य) को। यह प्रत्येक ऑब्जेक्ट पर फ़ंक्शन को पुनरावृत्त में कॉल करने का परिणाम देता है:

my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']

ध्यान दें कि मानचित्र () एक जनरेटर लौटाता है, इसलिए परिणाम एक वास्तविक सूची प्राप्त करने के लिए सूची () में पारित किया जाता है। संक्षेप में, आपका कार्य इस तरह किया जा सकता है:

lst2.append(list(map(itemgetter(0), lst)))

यह सूची की समझ का उपयोग करने के लिए एक वैकल्पिक विधि है, और किस विधि को अत्यधिक चुनने के लिए संदर्भ, पठनीयता और वरीयता पर निर्भर करता है।

अधिक जानकारी: https://docs.python.org/3/library/operator.html#operator.itemgetter


2

आपका कोड लगभग सही है। केवल समस्या सूची बोध का उपयोग है।

यदि आप इसका उपयोग करते हैं: (x [0] x में lst के लिए), तो यह एक जनरेटर वस्तु देता है। यदि आप इसका उपयोग करते हैं: [x [0] x में lst] के लिए, तो यह एक सूची लौटाता है।

जब आप किसी सूची में सूची बोध आउटपुट को जोड़ते हैं, तो सूची बोध का आउटपुट सूची का एकल तत्व होता है।

lst = [["a","b","c"], [1,2,3], ["x","y","z"]]
lst2 = []
lst2.append([x[0] for x in lst])
print lst2[0]

lst2 = [['a', १, 'x']]

lst2 [0] = ['a', 1, 'x']

कृपया मुझे बताएं कि क्या मैं गलत हूं।


1
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
outputlist = []
for values in lst:
    outputlist.append(values[0])

print(outputlist) 

आउटपुट: ['a', 1, 'x']


0

आपने कहा कि आपके पास एक मौजूदा सूची है। तो मैं उसके साथ जाऊंगा।

>>> lst1 = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [1, 2, 3]

अभी आप जनरेटर ऑब्जेक्ट को अपनी दूसरी सूची में जोड़ रहे हैं।

>>> lst2.append(item[0] for item in lst)
>>> lst2
[1, 2, 3, <generator object <genexpr> at 0xb74b3554>]

लेकिन आप शायद यह चाहते हैं कि यह पहली वस्तुओं की सूची हो

>>> lst2.append([item[0] for item in lst])
>>> lst2
[1, 2, 3, ['a', 1, 'x']]

अब हमने पहले आइटम की सूची मौजूदा सूची में जोड़ दी। यदि आप मौजूदा थीम वाले आइटम थीमवल्स जोड़ना चाहते हैं, तो उनकी सूची नहीं, तो आप list.extend का उपयोग करेंगे। उस स्थिति में हमें जनरेटर जोड़ने के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि वर्तमान सूची का विस्तार करने के लिए विस्तार उस जनरेटर का उपयोग वहां से मिलने वाली प्रत्येक वस्तु को जोड़ने के लिए करेगा।

>>> lst2.extend(item[0] for item in lst)
>>> lst2
[1, 2, 3, 'a', 1, 'x']

या

>>> lst2 + [x[0] for x in lst]
[1, 2, 3, 'a', 1, 'x']
>>> lst2
[1, 2, 3]

https://docs.python.org/3.4/tutorial/datastructures.html#more-on-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions


1
आपका जवाब अच्छा और यह क्या के लिए पूरा हो गया है लगता है ओ पी चाहता है की तरह है, लेकिन मैं शब्द लगता है appendप्रश्न में भ्रम पैदा कर रहा है। ऐसा लगता है कि वह आपके समाधान की सूची को समझना चाहता है।
बेरी जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.