2016-09-14 6 views
1

I eine Liste von Tupeln besitzen (num, id):ein Tupel aus einer Liste entfernen, wenn das Tupel ein bestimmtes Element enthält

l = [(1000, 1), (2000, 2), (5000, 3)] 

Das zweite Element jedes Tupel enthält die Kennung. Angenommen, ich möchte das Tupel mit der ID 2 entfernen, wie mache ich das?

I.e. Ich möchte die neue Liste sein: l = [(1000,1), (5000, 3)]

ich l.remove(2) versucht haben, aber es wird nicht funktionieren = [

+1

Ich dachte, Sie wissen zu lassen. Wenn Sie ein Element aus der bestehenden Liste entfernen möchten, wählen Sie zwischen den Antworten, die die Funktion 'pop()' oder 'remove()' verwenden. Wenn Sie eine neue Liste basierend auf gefilterter Logik erstellen möchten, wählen Sie unter den verbleibenden aus. –

+0

@MoinuddinQuadri ayyyyyyyyyyyyyyy –

Antwort

8

Sie können eine Liste Verständnis mit einem Filter verwenden, um dies zu erreichen.

l = [(1000, 1), (2000, 2), (5000, 3)] 
m = [(val, key) for (val, key) in l if key != 2] 
+0

Es wird funktionieren. Aber die Frage war, Element aus der Liste zu entfernen, aber Sie erstellen die neue Liste –

+0

@MoinuddinQuadri Das ist, weil ein iterable wie eine Liste nicht mutiert werden sollte, während es über seinen Inhalt iteriert, so ist die Standardlösung, eine neue Liste zu erstellen Verwenden eines bedingten Listenverständnisses. http://StackOverflow.com/Questions/1637807/modifying-list-while-iterating – Alexander

+0

@Alexander Ich stimme Ihnen bezüglich der Mutation Teil. Aber in diesem Fall, basierend auf der Anforderung; Idealerweise glaube ich, über die Kopie der Liste zu iterieren und Elemente aus der ursprünglichen Liste zu entfernen. –

2

Das ist, weil der Wert nicht in der Liste enthalten ist. Erstellen Sie stattdessen eine Liste der zweiten Elemente in Ihren Tupeln und entfernen Sie das Element an dieser Position.

del_pos = [x[1] for x in l].index(2) 
l.pop(del_pos) 

Beachten Sie, dass dies nur das erste Element entfernt. Wenn Ihre Instanz nicht eindeutig ist, verwenden Sie eine der anderen Lösungen. Ich glaube, dass dies schneller ist, aber nur den Single-Appearance-Fall behandelt.

0

Sie können es tun mit:

>>> l = [(1000, 1), (2000, 2), (5000, 3)] 
>>> for i in list(l): 
...  if i[1] == 2: 
...   l.remove(i) 

Falls Sie nur das erste Vorkommen entfernen möchten, fügen Sie break unter remove Linie

+0

Diese Methode ist auch viel langsamer.'' 'aus Zufallssimulation, randint seed (0) l = [(randint (1, 1000), randint (1, 5)) für _ im Bereich (10000)] % zeit l2 = [tup für tup in l wenn tup [1]! = 2] CPU-Zeiten: Benutzer 8,38 ms, sys: 1,97 ms, total: 10,3 ms Wandzeit: 8,7 ms %% Zeit für i in Liste (l): wenn i [1] == 2: l.entfernt (i) CPU-Zeiten: Benutzer 285 ms, sys: 3,69 ms, insgesamt: 289 ms Wandzeit: 285 ms''' – Alexander

2

Oder mit Filter:

l = [(1000, 1), (2000, 2), (5000, 3)] 
print(list(filter(lambda x: x[1] != 2, l))) 

Ausgabe:

[(1000, 1), (5000, 3)] 
0

Einfache Liste Verständnis:

[x for x in l if x[1] != 2] 
Verwandte Themen