Сравнение значений элементов списка с другими элементами в другом списке в Python - PullRequest
3 голосов
/ 11 февраля 2010

Я хочу сравнить значения в одном списке со значениями во втором списке и вернуть все те, которые находятся в первом списке, но не во втором, т.е.

list1 = ['one','two','three','four','five']
list2 = ['one','two','four']

вернет «три» и «пять».

У меня немного опыта работы с Python, так что это может оказаться нелепым и глупым способом решить его, но это то, что я сделал до сих пор:

def unusedCategories(self):
    unused = []
    for category in self.catList:
        if category != used in self.usedList:
            unused.append(category)
    return unused

Однако это приводит к ошибке «итерация по непоследовательности», которая, как я понимаю, означает, что один или оба «списка» на самом деле не являются списками (необработанный вывод для обоих в том же формате, что и мой первый пример)

Ответы [ 5 ]

8 голосов
/ 11 февраля 2010

set(list1).difference(set(list2))

6 голосов
/ 11 февраля 2010

Используйте наборы, чтобы получить разницу между списками:

>>> list1 = ['one','two','three','four','five']
>>> list2 = ['one','two','four']
>>> set(list1) - set(list2)
set(['five', 'three'])
1 голос
/ 11 февраля 2010

с set.difference:

>>> list1 = ['one','two','three','four','five']
>>> list2 = ['one','two','four']
>>> set(list1).difference(list2)
{'five', 'three'}

Вы можете пропустить конвертацию list2 для установки.

0 голосов
/ 11 февраля 2010

Все ответы здесь верны. Я бы использовал понимание списка, если списки короткие; наборы будут более эффективными. Изучая, почему ваш код не работает, я не получаю ошибку. (Это не работает, но это другая проблема).

>>> list1 = ['a','b','c']
>>> list2 = ['a','b','d']
>>> [c for c in list1 if not c in list2]
['c']
>>> set(list1).difference(set(list2))
set(['c'])
>>> L = list()
>>> for c in list1:
...     if c != L in list2:
...         L.append(c)
... 
>>> L
[]

Проблема в том, что выражение if не имеет смысла. Надеюсь, это поможет.

0 голосов
/ 11 февраля 2010

Вы можете сделать это с помощью наборов или понимания списка:

unused = [i for i in list1 if i not in list2]
...