2016-06-29 5 views
4

Ich habe eine Liste, die wie folgt aussieht:Test Typ des Wertes in der Liste während des Listenverständnisses VOR der Iteration auf Wert?

test = [[1,11],[2,22],3.0] 

und ich möchte aus es so eine Liste des ersten Wertes in jedem Paar erstellen:

[f for [f,l] in test] 

so, dass ich dieses Ergebnis zu erhalten :

[1,2] 

aber, wie erwartet, bekomme ich diesen Fehler:

TypeError: 'float' object is not iterable 

Also versuchte ich es wie folgt zu ändern:

[f for [f,l] in test if type([f,l]) != float] 

und ich immer noch den gleichen Fehler: in der Liste Verständnis

TypeError: 'float' object is not iterable 

Wie teste ich den Typ des Wertes in der Liste vor iteriert es über die Elemente im Inneren?

Antwort

3

Sie können das Auspacken nicht so früh in diesem Fall tun, da Sie das vollständige Element benötigen, um seinen Typ zu überprüfen.

>>> test = [[1,11],[2,22],3.0] 
>>> [item[0] for item in test if isinstance(item, list)] 
[1, 2] 

Die Art und Weise, dass Sie es tun wurden (for a, b in iterable) versucht, das auspacken, bevor Sie eine Chance haben, in der Art zu sehen, so dass Sie mit TypeError landen können, bevor Sie eine Chance zu betrachten Elemente vorhanden sind.

Wenn Sie wirklich, wie das Auspacken, wie Sie gehen, können Sie den Test ITESM zuerst filtern und dann Liste Verständnis auf die gefilterten Daten schreiben ...

>>> test_iterables = (item for item in test if isinstance(item, list)) 
>>> [f for f, l in test_iterables] 

Beachten Sie auch, dass je nach welche Arten Sie unterstützen wollen, könnte es besser sein zu tun
isinstance(item, collections.Sequence) oder isinstance(item, collections.Iterable)

+0

ignorieren meine jetzt gelöschten Kommentar: Es war ein nicht verwandtes Thema. Das funktioniert. – rosstripi

0

Ihr Auspacken funktioniert nicht, weil die Liste nicht passenden typ enthält es. Sie können einfach auswählen, auf hasattr da nur Ihre Listen (in diesem Fall) wird das Attribut __len__ und Index das erste Element der Liste:

>>> test = [[1,11],[2,22],3.0] 
>>> [i[0] for i in test if hasattr(i, '__len__')] 
[1, 2] 
2
test = [[1,11],[2,22],3.0] 

print([f for [f,l] in filter(lambda x: type(x) is list, test)]) 

[1, 2]

0

Sie können einen einfachen Ansatz versuchen wie folgt aus:

test = [[1,11],[2,22],3.0] 

test_copy = test[:] 

for num in test: 
    if type(num) != list: 
     test_copy.remove(num) 
else: 
    print([num[0] for num in test_copy]) 

Ausgang:

[1, 2] 

Sie können auch die letzte Zeile mit diesem ersetzen, wenn Sie wollen:

print(list(map(lambda x: x[0], test_copy)))