2016-04-11 17 views
-5

bekommen habe ich eine Liste von Tupeln wie folgt aus:Python nur ganze Zahlen aus einer Liste von Tupeln 3

[(a,3), (b, 4), (c, 5), (d, 1), (e,2)] 

und ich möchte eine Liste wie folgt daraus extrahieren:

[3, 4, 5, 1, 2] 

Wie würde ich darüber gehen? Ich konnte nicht herausfinden, wie es geht.

Lesbarkeit ist in diesem Zusammenhang sekundär zur Geschwindigkeit, da dieser Code in einer relativ gut kommentierten Funktion versteckt wird.

+1

'[i [-1] i in lst für]' –

+3

Dies ist ein so einfaches Problem kann ich nicht glaube, du hast nichts versucht, was du uns in deiner Frage zeigen kannst. –

+0

Benötigen Sie die ganze Liste geladen oder haben Sie auch Speicherbeschränkungen? –

Antwort

5

Wenn Ziel Effizienz ist, schauen wir uns die verschiedenen Methoden aussehen:

from timeit import timeit 
from operator import itemgetter 

T = [('a',3), ('b', 4), ('c', 5), ('d', 1), ('e',2)] 

def one(): 
    [v for _, v in T] 

def two(): 
    [v[-1] for v in T] 

def three(): 
    list(map(itemgetter(1), T)) 

def four(): 
    list(map(lambda x:x[1], T)) 

def five(): 
    list(zip(*T))[1] 

for func in (one, two, three, four, five): 
    print(func.__name__ + ':', timeit(func)) 

Ergebnisse:

one: 0.8771702060003008 
two: 1.0403959849991224 
three: 1.5230304799997612 
four: 1.9551190909996876 
five: 1.3489514130005773 

So, die erste scheint effizienter zu sein. Beachten Sie, dass anstelle der Liste Tupel verwenden, um die Reihen ändern, ist aber langsamer for one and two:

one: 1.620873247000418 # slower 
two: 1.7368736420003188 # slower 
three: 1.4523903099998279 
four: 1.9480371049994574 
five: 1.2643559589996585 
+0

Ich frage mich, warum diese Antwort einen Downvote bekommt. –

0

Generatoren für den Sieg:

from operator import itemgetter 
l = [(a,3), (b, 4), (c, 5), (d, 1), (e,2)] 
r = map(itemgetter(1), l) 
0
tuples = [(a,3), (b, 4), (c, 5), (d, 1), (e,2)] 

Wenn jedes Mal Zahlen auf der zweiten Position:

numbers = [item[1] for item in tuples] 

Elif-Nummer ist eine ganze Zahl:

numbers = [value for item in tuples for value in item if isinstance(value, int)] 

Elif Zahl String wie '3':

numbers = [value for item in tuples for value in item if isinstance(value, str) and value.isdigit()] 
0

Hier ist ein weiterer Weg, um es mit zip zu tun:

>>> l = [('a',3), ('b', 4), ('c', 5), ('d', 1), ('e',2)] 
>>> list(zip(*l))[1] 
(3, 4, 5, 1, 2) 

Wenn Sie wirklich eine Liste anstelle eines brauchen Tupel:

>>> list(list(zip(*l))[1]) 
[3, 4, 5, 1, 2] 
0

Sie tun können:

>>> map(lambda x:x[1], lst) 
[3, 4, 5, 1, 2] 

In Python 3, tun:

>>> list(map(lambda x:x[1], lst)) 
Verwandte Themen