टुपल्स की सूची में पहला तत्व कैसे प्राप्त करें?


178

मेरे पास एक सूची है जैसे नीचे पहला तत्व आईडी है और दूसरा स्ट्रिंग है:

[(1, u'abc'), (2, u'def')]

मैं इस सूची से केवल tuples की आईडी बनाना चाहता हूं:

[1,2]

मैं इस सूची का उपयोग करूँगा __inताकि इसे पूर्णांक मानों की सूची बनाने की आवश्यकता हो।

जवाबों:



68

तत्वों को निकालने के लिए जिप फ़ंक्शन का उपयोग करें:

>>> inpt = [(1, u'abc'), (2, u'def')]
>>> unzipped = zip(*inpt)
>>> print unzipped
[(1, 2), (u'abc', u'def')]
>>> print list(unzipped[0])
[1, 2]

संपादित करें (@BradSolomon): उपरोक्त पायथन 2.x के लिए काम करता है, जहां zipएक सूची देता है।

पायथन 3.x में, zipएक पुनरावृत्त रिटर्न देता है और निम्नलिखित उपरोक्त के बराबर है:

>>> print(list(list(zip(*inpt))[0]))
[1, 2]

क्या इसके लिए एक अलग आयात की आवश्यकता है?
जुलियनडॉटनॉट

2
@JuliandotNut नहीं, यह एक अंतर्निहित कार्य है। (पायथन 2.x में)
वेनसैन

22

क्या आपका मतलब कुछ इस तरह का था?

new_list = [ seq[0] for seq in yourlist ]

आपके पास वास्तव में tupleवस्तुओं की एक सूची है , न कि सेटों की सूची (जैसा कि आपका मूल प्रश्न निहित है)। यदि यह वास्तव में सेट की सूची है, तो कोई पहला तत्व नहीं है क्योंकि सेट का कोई क्रम नहीं है।

यहाँ मैंने एक फ्लैट सूची बनाई है क्योंकि आम तौर पर 1 तत्व ट्यूपल्स की सूची बनाने की तुलना में अधिक उपयोगी लगता है। हालांकि, आप आसानी से बस की जगह 1 तत्व tuples की एक सूची बना सकते हैं seq[0]के साथ (seq[0],)


मैं इसे करने की कोशिश की। यह यह त्रुटि देता है:int() argument must be a string or a number, not 'QuerySet'
विंबलहल्ली २ this

4
@wasimbhalli - int()मेरे समाधान में कहीं नहीं है, इसलिए आप जो अपवाद देख रहे हैं वह कोड में बाद में आना चाहिए।
mgilson

मैंने सवाल अपडेट किया है, मुझे इस सूची का उपयोग बाद में __inडेटा को छानने के लिए करने की आवश्यकता है
विंबहल्ली

क्या है __in? - आपके द्वारा दिए गए उदाहरण इनपुट के आधार पर, यह पूर्णांकों की एक सूची बनाएगा। हालाँकि, यदि आपकी ट्यूपल्स की सूची पूर्णांक से शुरू नहीं होती है, तो आपको पूर्णांक नहीं मिलेंगे और आपको उन्हें पूर्णांक बनाने की आवश्यकता होगी int, या यह जानने की कोशिश करें कि आपके पहले तत्व को पूर्णांक में क्यों नहीं परिवर्तित किया जा सकता है।
mgilson

new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]काम करता है ?
pR0P 12

11

आप "टपल अनपैकिंग" का उपयोग कर सकते हैं:

>>> my_list = [(1, u'abc'), (2, u'def')]
>>> my_ids = [idx for idx, val in my_list]
>>> my_ids
[1, 2]

पुनरावृति समय पर प्रत्येक टपल को अनपैक किया जाता है और इसके मान चरों पर सेट किए जाते हैं idxऔर val

>>> x = (1, u'abc')
>>> idx, val = x
>>> idx
1
>>> val
u'abc'

8

यह वही operator.itemgetterहै जिसके लिए है

>>> a = [(1, u'abc'), (2, u'def')]
>>> import operator
>>> b = map(operator.itemgetter(0), a)
>>> b
[1, 2]

itemgetterबयान एक फ़ंक्शन उस तत्व आपके द्वारा निर्दिष्ट सूचकांक देता है। यह लिखने जैसा ही है

>>> b = map(lambda x: x[0], a)

लेकिन मुझे लगता है कि itemgetterयह एक स्पष्ट और अधिक स्पष्ट है

यह कॉम्पैक्ट सॉर्ट स्टेटमेंट बनाने के लिए आसान है। उदाहरण के लिए,

>>> c = sorted(a, key=operator.itemgetter(0), reverse=True)
>>> c
[(2, u'def'), (1, u'abc')]

7

प्रदर्शन के दृष्टिकोण से, python3.X में

  • [i[0] for i in a]और list(zip(*a))[0]बराबर हैं
  • वे तेजी से कर रहे हैं list(map(operator.itemgetter(0), a))

कोड

import timeit


iterations = 100000
init_time = timeit.timeit('''a = [(i, u'abc') for i in range(1000)]''', number=iterations)/iterations
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = [i[0] for i in a]''', number=iterations)/iterations - init_time)
print(timeit.timeit('''a = [(i, u'abc') for i in range(1000)]\nb = list(zip(*a))[0]''', number=iterations)/iterations - init_time)

उत्पादन

3.491014136001468e-05

3.422205176000717e-05


6

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

>>> a = [(1, u'abc'), (2, u'def')]
>>> a
[(1, u'abc'), (2, u'def')]
>>> dict(a).keys()
[1, 2]
>>> dict(a).values()
[u'abc', u'def']
>>> 

4
यह आदेश खो देगा। यह साथ काम कर सकते हैं ordereddict, यद्यपि।
टिम टिसडल

यदि आपके समाधान से 2 या अधिक टुपल्स का एक ही पहला तत्व काम नहीं करेगा
kederrac

3

जब मैं भागा (जैसा कि ऊपर सुझाव दिया गया है):

>>> a = [(1, u'abc'), (2, u'def')]
>>> import operator
>>> b = map(operator.itemgetter(0), a)
>>> b

लौटने के बजाय:

[1, 2]

मुझे यह रिटर्न के रूप में प्राप्त हुआ:

<map at 0xb387eb8>

मैंने पाया कि मुझे सूची () का उपयोग करना था:

>>> b = list(map(operator.itemgetter(0), a))

सफलतापूर्वक इस सुझाव का उपयोग कर एक सूची वापस करने के लिए। उस ने कहा, मैं इस समाधान से खुश हूं, धन्यवाद। (स्पाइडर, iPython कंसोल, पायथन v3.6 का उपयोग करके परीक्षण / चलाया गया)


3

मैं सोच रहा था कि विभिन्न दृष्टिकोणों के रनटाइम्स की तुलना करना उपयोगी हो सकता है इसलिए मैंने एक बेंचमार्क बनाया ( simple_benchmark का उपयोग करके ) )

मैं) बेंचमार्क 2 तत्वों के साथ tuples रहा है यहां छवि विवरण दर्ज करें

जैसा कि आप इंडेक्स 0शो द्वारा ट्यूपल्स से पहले तत्व का चयन करने की उम्मीद कर सकते हैं, ठीक 2 मानों की अपेक्षा करके सबसे तेज़ समाधान अनपैकिंग समाधान के करीब है।

import operator
import random

from simple_benchmark import BenchmarkBuilder

b = BenchmarkBuilder()



@b.add_function()
def rakesh_by_index(l):
    return [i[0] for i in l]


@b.add_function()
def wayneSan_zip(l):
    return list(list(zip(*l))[0])


@b.add_function()
def bcattle_itemgetter(l):
     return list(map(operator.itemgetter(0), l))


@b.add_function()
def ssoler_upacking(l):
    return [idx for idx, val in l]

@b.add_function()
def kederrack_unpacking(l):
    return [f for f, *_ in l]



@b.add_arguments('Number of tuples')
def argument_provider():
    for exp in range(2, 21):
        size = 2**exp
        yield size, [(random.choice(range(100)), random.choice(range(100))) for _ in range(size)]


r = b.run()
r.plot()

II) बेंचमार्क जिसमें 2 या अधिक तत्वों के साथ ट्यूपल हों यहां छवि विवरण दर्ज करें

import operator
import random

from simple_benchmark import BenchmarkBuilder

b = BenchmarkBuilder()

@b.add_function()
def kederrack_unpacking(l):
    return [f for f, *_ in l]


@b.add_function()
def rakesh_by_index(l):
    return [i[0] for i in l]


@b.add_function()
def wayneSan_zip(l):
    return list(list(zip(*l))[0])


@b.add_function()
def bcattle_itemgetter(l):
     return list(map(operator.itemgetter(0), l))


@b.add_arguments('Number of tuples')
def argument_provider():
    for exp in range(2, 21):
        size = 2**exp
        yield size, [tuple(random.choice(range(100)) for _
                     in range(random.choice(range(2, 100)))) for _ in range(size)]

from pylab import rcParams
rcParams['figure.figsize'] = 12, 7

r = b.run()
r.plot()

0

वे टुपल्स हैं, सेट नहीं। तुम यह केर सकते हो:

l1 = [(1, u'abc'), (2, u'def')]
l2 = [(tup[0],) for tup in l1]
l2
>>> [(1,), (2,)]

2
वास्तव में नहीं पूछा जा रहा है
मैड फिजिसिस्ट

0

आप अपने टुपल्स को अनपैक कर सकते हैं और सूची बोध का उपयोग करके केवल पहला तत्व प्राप्त कर सकते हैं :

l = [(1, u'abc'), (2, u'def')]
[f for f, *_ in l]

उत्पादन:

[1, 2]

इससे कोई फर्क नहीं पड़ेगा कि आपके पास कितने तत्व हैं:

l = [(1, u'abc'), (2, u'def', 2, 4, 5, 6, 7)]
[f for f, *_ in l]

उत्पादन:

[1, 2]

0

मुझे आश्चर्य हुआ कि किसी ने सुन्न का उपयोग करने का सुझाव क्यों नहीं दिया, लेकिन अब जाँच के बाद मुझे समझ में आया। यह मिश्रित प्रकार के सरणियों के लिए शायद सबसे अच्छा नहीं है।

यह numpy में एक समाधान होगा:

>>> import numpy as np

>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.