2016-07-30 3 views
0

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

У меня есть два списка

>>> l1 = [[(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked')]] 
>>> 
>>> l2 = [(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked'), (9, 8, 'CC', 'cc', -1, 'and', 'and'), (10, 7, 'JJ', 'xcomp', -1, 'angry', 'angry')] 

Я пытаюсь проверить, если один является подмножеством другого.

Но до этого я проверил результаты вычитания одного списка из другого, и я получил неутешительные результаты -

>>> [word for word in l1 if word not in l2] 
[[(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked')]] 

>>> [word for word in l2 if word not in l1] 
[(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked'), (9, 8, 'CC', 'cc', -1, 'and', 'and'), (10, 7, 'JJ', 'xcomp', -1, 'angry', 'angry')] 

Почему я получаю одинаковые списки, как мои результаты? Связано ли это с тем, что они являются кортежами?

ответ

3

Проблема заключается в том, что l1 является списком списка кортежа (то есть [[кортеж]]), в то время как l2 список кортежа (т.е. [кортеж]). Если вы измените это, вывод из списков будет таким, какой вы ожидаете:

l1 = [(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked')] 
l2 = [(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked'), (9, 8, 'CC', 'cc', -1, 'and', 'and'), (10, 7, 'JJ', 'xcomp', -1, 'angry', 'angry')] 
​ 
a = [word for word in l1 if word not in l2] 
b = [word for word in l2 if word not in l1] 
​ 
print a 
print b 

[] 
[(9, 8, 'CC', 'cc', -1, 'and', 'and'), (10, 7, 'JJ', 'xcomp', -1, 'angry', 'angry')] 
0

Вы можете просто использовать наборы и операторы < = (подмножество).

>>> l1 = [2,4,6,8] 
>>> l2 = [2,4,6,8,10] 
>>> set(l1) <= set(l2) 
True 
+0

Я уже пробовал это. Я получаю 'TypeError: unhashable type: 'list'' –

0

Использование issubset,

l1 = [(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked')] 
l2 = [(7, -1, 'VBD', 'null', -1, 'looked', 'looked'), (8, 7, 'JJ', 'xcomp', -1, 'shocked', 'shocked'), (9, 8, 'CC', 'cc', -1, 'and', 'and'), (10, 7, 'JJ', 'xcomp', -1, 'angry', 'angry')] 

>>> set(l1).issubset(l2) 
True 
+2

' issubset' принимает в качестве аргумента произвольный итерируемый объект; вам не нужно сначала создавать набор. – chepner

+0

@chepner, thx для указания этого, только что обновил мой ответ. – SparkAndShine

+0

Уверены ли 'set (l1)' вы не получили никакого сообщения об ошибке, например 'TypeError: unhashable type: 'list''? –

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