मेरे पास एक सूची है जैसे नीचे पहला तत्व आईडी है और दूसरा स्ट्रिंग है:
[(1, u'abc'), (2, u'def')]
मैं इस सूची से केवल tuples की आईडी बनाना चाहता हूं:
[1,2]
मैं इस सूची का उपयोग करूँगा __inताकि इसे पूर्णांक मानों की सूची बनाने की आवश्यकता हो।
मेरे पास एक सूची है जैसे नीचे पहला तत्व आईडी है और दूसरा स्ट्रिंग है:
[(1, u'abc'), (2, u'def')]
मैं इस सूची से केवल tuples की आईडी बनाना चाहता हूं:
[1,2]
मैं इस सूची का उपयोग करूँगा __inताकि इसे पूर्णांक मानों की सूची बनाने की आवश्यकता हो।
जवाबों:
तत्वों को निकालने के लिए जिप फ़ंक्शन का उपयोग करें:
>>> 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]
क्या आपका मतलब कुछ इस तरह का था?
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'
int()मेरे समाधान में कहीं नहीं है, इसलिए आप जो अपवाद देख रहे हैं वह कोड में बाद में आना चाहिए।
__inडेटा को छानने के लिए करने की आवश्यकता है
__in? - आपके द्वारा दिए गए उदाहरण इनपुट के आधार पर, यह पूर्णांकों की एक सूची बनाएगा। हालाँकि, यदि आपकी ट्यूपल्स की सूची पूर्णांक से शुरू नहीं होती है, तो आपको पूर्णांक नहीं मिलेंगे और आपको उन्हें पूर्णांक बनाने की आवश्यकता होगी int, या यह जानने की कोशिश करें कि आपके पहले तत्व को पूर्णांक में क्यों नहीं परिवर्तित किया जा सकता है।
new_list = [ seq[0] for seq in yourlist if type(seq[0]) == int]काम करता है ?
आप "टपल अनपैकिंग" का उपयोग कर सकते हैं:
>>> 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'
यह वही 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')]
प्रदर्शन के दृष्टिकोण से, 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
यदि ट्यूपल अद्वितीय हैं तो यह काम कर सकता है
>>> 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']
>>>
ordereddict, यद्यपि।
जब मैं भागा (जैसा कि ऊपर सुझाव दिया गया है):
>>> 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 का उपयोग करके परीक्षण / चलाया गया)
मैं सोच रहा था कि विभिन्न दृष्टिकोणों के रनटाइम्स की तुलना करना उपयोगी हो सकता है इसलिए मैंने एक बेंचमार्क बनाया ( 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()
वे टुपल्स हैं, सेट नहीं। तुम यह केर सकते हो:
l1 = [(1, u'abc'), (2, u'def')]
l2 = [(tup[0],) for tup in l1]
l2
>>> [(1,), (2,)]
आप अपने टुपल्स को अनपैक कर सकते हैं और सूची बोध का उपयोग करके केवल पहला तत्व प्राप्त कर सकते हैं :
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]
मुझे आश्चर्य हुआ कि किसी ने सुन्न का उपयोग करने का सुझाव क्यों नहीं दिया, लेकिन अब जाँच के बाद मुझे समझ में आया। यह मिश्रित प्रकार के सरणियों के लिए शायद सबसे अच्छा नहीं है।
यह numpy में एक समाधान होगा:
>>> import numpy as np
>>> a = np.asarray([(1, u'abc'), (2, u'def')])
>>> a[:, 0].astype(int).tolist()
[1, 2]