2012-03-27 4 views
1

Я знаю, что этот вопрос обсуждался ранее, и я знаю, что это такой новичок и простой вопрос, но по какой-то причине Я не могу обернуть вокруг кода, который понадобится для этого. Вот практический пример, который мне нужен для:Создайте новый список, содержащий список x, но не элементы в списке y, такие же, как в списке x - python

Допустим, у меня есть учетная запись tumblr, и я следую за 5 людьми, из которых 3 следуют за мной.

iFollow = [Tom, Richard, Bob, Samantha, Kat] 
followsMe = [Samantha, Kat, Bob] 

Теперь я хочу, чтобы неследовать людей, что я следую, однако не следует меня. Итак, в этом примере я бы хотел отменить подписку Tom и Richard, потому что, хотя я и следую за ними, они не следуют за мной. Я хотел бы создать список:

unfollowThese = [Tom, Richard] 

Я не могу на всю жизнь выяснить, как это сделать. Я знаю, что есть пересечение, найти общие элементы, которые будут выводить «Боб», похоже, что я хочу наоборот, мне нужны элементы, которые являются общими в обоих списках, удаленных из нового списка, который я хочу сделать.

I.E. Я хочу, чтобы элементы были обычными в iFollow и после этого следует удалить из unfollowThese, поскольку я не хочу отменить подписку на моих подписчиков.

Спасибо.

p.s. если вы можете думать о лучшем названии, пожалуйста, измените его, я не мог думать ни о чем назвать его ..

ответ

4

Используя list comprehensions вопросы, если заказ:

unfollowThese = [ person for person in iFollow if person not in followsMe ] 

Использование sets если порядок элементов не имеет значения:

import sets 
s1 = sets.Set(iFollow) 
unfollowThese = s1.difference(followsMe) 
+1

Только один из них потребности для преобразования в 'set' - единственное преимущество преобразования обоих - вы можете написать d ifference как 's1 - s2'. – agf

+0

Правда! Благодаря :) –

1
iFollow = ['Tom', 'Richard', 'Bob', 'Samantha', 'Kat'] 
followsMe = ['Samantha', 'Kat', 'Bob'] 


unfollowThese = [name for name in iFollow if name not in followsMe] 

# returns: ['Tom', 'Richard'] 
4

Самый простой способ заключается в использовании set difference:

unfollowThese = set(iFollow).difference(followsMe) 

Это должно также быстрее, чем понимание списка, если followsMe большой - это линейная средняя временная сложность, O (n) в длине followsMe, а не линейная как по длине, так и по O (n * k).

Просто чтобы быть полным, обратите внимание, что вы можете использовать set для ускорения «вопросов порядка» версию штриховки времени, а также:

followsMeSet = set(followsMe) 
unfollowThese = [person for person in iFollow if person not in followsMeSet] 

как set членские тесты постоянны среднее время.

1

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

unfollowThese = [x for x in iFollow if x not in followsMe] 

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

  • Нет связанных вопросов^_^