2015-03-23 5 views
3

Я хочу удалить список кортежей в python. У меня есть список поКак удалить элементы из списка кортежей?

l = [('name','sam'),('age', 20),('sex', 'male')]

и другой список кортежей

r = [('name','sam'),('age', 20)]

я пытаюсь удалить те элементы, которые в r и l обоих. Я делаю это:

for item in l: 
    if item in r: 
     del item 

Но элементы не удаляются. Выход ничего и при печати измененный список:

>>> l

Затем первоначальный список печати.

[('name','sam'),('age', 20),('sex', 'male')]

Пожалуйста, помогите мне, как я могу удалить элементы из списка кортежей.

+1

Причиной наблюдаемого поведения является то, что с помощью 'for item in l' вы создаете (временную) ссылку на каждый элемент списка и' del', чтобы эта ссылка не касалась самого списка.Также всегда сложно попытаться изменить список, который вы зацикливаете с помощью цикла 'for'. – PeterE

ответ

3

Вы можете tranform оба списка в наборах и вычитать их:

l = [('name','sam'),('age', 20),('sex', 'male')] 
r = [('name','sam'),('age', 20)] 

Следующая строка будет возвращать только те элементы, которые в l, но не являются в r:

set(l) - set(r) 
+0

Хороший ответ, но я думаю, что он точно не делает то, что он описал. В частности, когда элементы в 'l' не уникальны, тогда ваш код также удаляет дубликаты. Который может или не может быть тем, что он на самом деле хочет. – kdani

0

Вы можете используйте filter().

for item in filter(lambda x: x not in r, l): 
    # You can use your items here 

# The list gets out of scope, so if there are no other references, 
# the garbage collector will destroy it anyway 

Или, если вам нужно использовать список в других местах тоже, вы можете также рассмотреть вопрос о создании нового списка вместо этого, используя список понимание:

l = [i for i in l if i not in r] 
0

Это возвращает список элементов, которые в l, а не в r.

Разница между этим решением и решением для подстановочных наборов заключается в том, что вы не теряете информацию, если у вас есть дубликаты внутри вашего списка. Вы потеряете эту информацию с вычитанием устанавливает

difference = [item for item in l if item not in r] 
0

Есть много подходов пойти ввернуть эту проблему:

  1. найти и тех, кто в списке, l and r для нахождения, которые являются общими в обоих затем использовать для управления этим таким образом: [x for x in l if x not in l and r ]. это будет немного более эффективно, чем приведенные выше ответы.

  2. Правильный ответ будет падать в некоторых случаях, например, если len(l) < len(r). поэтому для преодоления этой проблемы просто list=[] p = l and r list.extend([ [x for x in l if x not in p ], [x for x in r if x not in p ]]) Надеюсь, что она исчезнет из некоторых открытий.

Смежные вопросы