2016-09-14 4 views
1

У меня есть список кортежей (NUM, ID):Удалить кортеж из списка, если кортеж содержит определенный элемент

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

Второй элемент каждого кортежа содержит идентификатор. Скажите, что я хочу удалить кортеж с идентификатором 2, как мне это сделать?

I.e. Я хочу, чтобы новый список будет: l = [(1000,1), (5000, 3)]

Я попытался l.remove(2), но он не будет работать = [

+1

Я думал, чтобы вы знали. Если вы хотите удалить элемент из существующего списка, выберите один из ответов, который использует функцию 'pop()' или 'remove()'. Если вы хотите создать новый список на основе фильтрованной логики, выберите один из оставшихся. –

+0

@MoinuddinQuadri ayyyyyyyyyyyyyy –

ответ

8

Вы можете использовать список понимание с фильтром для достижения этой цели.

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

Будет работать. Но вопрос состоял в том, чтобы удалить элемент из списка, но вы создаете новый список –

+0

@MoinuddinQuadri. Это связано с тем, что итерабельность, такая как список, не должна быть мутирована во время итерации по ее содержимому, поэтому стандартное решение заключается в создании нового списка используя условное понимание списка. http://stackoverflow.com/questions/1637807/modifying-list-while-iterating – Alexander

+0

@ Александр Я согласен с вами относительно части мутации. Но в этом случае, исходя из требования; Я считаю, что это идеальный способ перебора копии списка и удаления элементов из исходного списка. –

2

Это потому, что значение не в списке. Вместо этого, что-то вроде ниже: сформируйте список вторых элементов в ваших кортежах, а затем удалите элемент в этой позиции.

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

Обратите внимание, что это удаляет только первый такой элемент. Если ваш экземпляр не уникален, используйте одно из других решений. Я считаю, что это происходит быстрее, но обрабатывает только случай с единственным видом.

0

Вы можете сделать это с:

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

В случае, если вы хотите удалить только первое вхождение, добавьте break ниже remove линии

+0

Этот метод также намного медленнее.'' 'от случайного импорта семян, randint семена (0) l = [(randint (1, 1000), randint (1, 5)) для _ в диапазоне (10000)] % время l2 = [tup для tup in l, если tup [1]! = 2] Время процессора: пользователь 8.38 ms, sys: 1.97 ms, всего: 10.3 ms Время на стене: 8,7 мс %% время для i в списке (l): if i [1] == 2: l.remove (i) Время процессора: пользователь 285 мс, sys: 3,69 мс, всего: 289 мс Время на стене: 285 мс''' – Alexander

2

Или с помощью фильтра:

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

выход:

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

Простой список понимание:

[x for x in l if x[1] != 2] 
Смежные вопросы