2013-10-06 6 views
0

У меня есть списокУдаление конкретных кортежи из списка

a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)] 

Если я скажу, что:

for x in a: 
    if x[0]==1: 
     print x 

я получить ожидаемый результат: (1,2) (1,4) (1,8) (1,10) (1,6)

Однако я хочу, чтобы удалить все вхождения всех кортежей в формате (1, х), Так

for x in a: 
    if x[0]==1: 
     a.remove(x) 

я подумал, что все вхождения должно быть removed.However, когда я сказать

Print a 

я получаю [(1,4), (2,6), (3,6), (1,6)]

Не все кортежи были удалены. Как мне это сделать.?? Благодаря

ответ

4

Я хотел бы использовать list comprehension:

def removeTuplesWithOne(lst): 
    return [x for x in lst if x[0] != 1] 

a = removeTuplesWithOne([(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)]) 

Для меня это больше, чем вещий встроенный filter функции.

P.S. Эта функция не изменяет ваш первоначальный список, он создает новый. Если ваш первоначальный список огромен, я бы, вероятно, использовать generator expression так:

def removeTuplesWithOne(lst): 
    return (x for x in lst if x[0] != 1) 
+0

это лучшее решение – doniyor

1

Это не тот же подход, как ваш, но должен работать

a = filter(lambda x: x[0] != 1, a) 
1

Вы можете использовать list comprehension как это, чтобы отфильтровать элементы, которые имеют 1 в качестве первого элемента.

>>> original = [(1, 2), (1, 4), (2, 6), (1, 8), (3, 6), (1, 10), (1, 6)] 
>>> [item for item in original if item[0] != 1] 
[(2, 6), (3, 6)] 

Это создает новый список, а не модифицирует существующий. 99% времени, это будет хорошо, но если вы потребность изменить первоначальный список, вы можете сделать это путем присвоения обратно:

original[:] = [item for item in original if item[0] != 1] 

Здесь мы используем назначение ломтика, который работает путем замены каждого пункта от начала до конца исходного списка ([:]) с элементами из списка. Если вы просто использовали обычное назначение, вы просто измените то, что указало на имя original, а не на самом деле изменить сам список.

+0

, но я думаю, он хочет удалить из списка. ваш код удаляет их из списка? – doniyor

+0

Вы всегда можете назначить обратно оригиналу, если действительно необходимо изменить исходный список (в 99% случаев он не будет). 'original [:] = new'. Я отредактировал для небольшого форматирования и добавил это объяснение. –

+0

И может быть причина для downvoting? – thefourtheye

0

Вы можете сделать это с выражением generator, если вы имеете дело с огромными объемами данных:

a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)] 

# create a generator 
a = ((x,y) for x, y in a if x == 1) 

# simply convert it to a list if you need to... 
>>> print list(a) 
[(1, 2), (1, 4), (1, 8), (1, 10), (1, 6)] 
Смежные вопросы