2017-04-06 4 views
0

Ich habe zwei Listen list1 und list2, möchte ich in der 2. eineine Liste mit den Indizes einer anderen Liste Füllung

for i in list1: 
     print(i) ## this works fine 
Test_features_index.append(list1.index(i for i in list2))# here not that well 

läuft dies alle Indizes der des Elements von list1, die auch bekommen doens't Arbeit hier ist, was ich bekommen:

<ipython-input-35-8d7ff70a8be0> in <module>() 
----> 1 Test_features_index.append(list1.index(i for i in list2)) 

ValueError: <generator object <genexpr> at 0x0000021710BBA7D8> is not in list 

Jede Idee, wie das zu tun? Ich wollte eine for-Schleife vermeiden, aber nicht sicher, ob es möglich ist

+0

Sie könnten es mit einem Listenverständnis tun, z. 'Test_features_index.append ([list1.index (i) für i in list2, wenn i in list1]) (vorausgesetzt, dass Sie das Ergebnis tatsächlich an eine andere Liste mit dem Namen' Test_features_index' anhängen wollten). Beachten Sie, dass der Index nur den ersten Index zurückgibt, wenn ein Element mehrmals auftritt. 'index' gibt eine Ausnahme aus, wenn das Element nicht gefunden werden kann und' 'i in list1' 'erfordert. – roganjosh

Antwort

1

Sie versuchen, den Index eines Generatorausdrucks zu finden, der angeblich in Ihrer Liste ist. Außerdem ist die wiederholte Verwendung von list.index nicht sehr performant, da Sie jedes Mal die gesamte Länge der Liste (worst case) ausführen.

set2 = set(list2) 
Test_features_index = [i for i, x in enumerate(list1) if x in set2] 

Mit einem Satz für die Suche von freigegebenen Elementen gewährleistet 0 (1) Lookup Zeit als für Listen zu O (n) gegenüber:

Sie können stattdessen ein Liste Verständnis mit enumerate verwenden.

+0

danke für die Hilfe Ich verstehe nicht, warum du set2 extra benutzt hast, es hat funktioniert ohne ;-) – Engine

+0

@Engine Es ist ein Performance-Hack. Die Suche nach Mitgliedschaft ist schneller als bei Listen. –

Verwandte Themen