Создать новый список, содержащий список x, но не элементы в списке y, которые такие же, как в списке x - python - PullRequest
1 голос
/ 27 марта 2012

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

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

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

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

unfollowThese = [Tom, Richard]

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

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

Спасибо.

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

Ответы [ 4 ]

4 голосов
/ 27 марта 2012

Самый простой способ - использовать установить разницу :

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 тесты на членство являются постоянным средним временем.

4 голосов
/ 27 марта 2012

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

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

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

import sets
s1 = sets.Set(iFollow)
unfollowThese = s1.difference(followsMe)
1 голос
/ 27 марта 2012

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

unfollowThese = [x for x in iFollow if x not in followsMe]
1 голос
/ 27 марта 2012
iFollow = ['Tom', 'Richard', 'Bob', 'Samantha', 'Kat']
followsMe = ['Samantha', 'Kat', 'Bob']


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

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