2014-12-22 3 views
0

Скажем, у меня есть два списка списков в Python,тест, если два списка списков, равны

l1 = [['a',1], ['b',2], ['c',3]] 
l2 = [['b',2], ['c',3], ['a',1]] 

Что самый элегантный способ проверить они равны в том смысле, что элементы l1 просто некоторые перестановка элементов в l2?

Примечание, чтобы сделать это для обычных списков see here, однако это использует set, который не работает для списков списков.

+3

'==' on 'sorted'. – Maroun

+0

Внутренние списки считаются «равными», если одна из них является перестановкой другой? В обоих случаях, как насчет повторений? –

ответ

9
l1 = [['a',1], ['b',2], ['c',3]] 
l2 = [['b',2], ['c',3], ['a',1]] 
print sorted(l1) == sorted(l2) 

Результат:

True 
1

Set не работает для списка списков, но это работает для списка кортежей. Sou вы можете map каждый подсписок в кортеж и использовать set как:

>>> l1 = [['a',1], ['b',2], ['c',3]] 
>>> l2 = [['b',2], ['c',3], ['a',1]] 
>>> print set(map(tuple,l1)) == set(map(tuple,l2)) 
True 
+1

Это потеряло бы информацию о счете: другими словами, если 'l1' имел 10' ['a', 1] 'sublists и' l2', было только 1, он все равно сказал бы, что они равны. (Возможно, этого хочет OP, но это не то, что я догадался, основываясь на «перестановке».) – DSM

+0

Вы правы. Не думал так. –

0

Для одного лайнера решения на поставленный выше вопрос, обратитесь к моему ответу на this question

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

пусть два списка быть песни1 и песни2, и ваше требование, чтобы убедиться, является ли два списка имеют одинаковые элементы, то, как за мной, следующий будет лучший подход: -

if ((len(list1) == len(list2)) and 
    (all(i in list2 for i in list1))): 
    print 'True' 
else: 
    print 'False' 

Вышеупомянутый фрагмент кода будет работать с вашей потребностью, т. Е. Все ли элементы списка List1 находятся в списке2 и наоборот. Элементы в обоих списках должны быть не в том же порядке.

Но если вы просто хотите проверить, являются ли все элементы list1 присутствует в list2 или нет, то вам необходимо использовать ниже кусок кода только: -

if all(i in list2 for i in list1): 
    print 'True' 
else: 
    print 'False' 

Разница заключается в том, позже будет напечатано True, если в списке2 есть некоторые дополнительные элементы, а также все элементы списка1. Простыми словами, , он гарантирует, что все элементы списка1 должны присутствовать в списке list2, независимо от того, есть ли в списке2 некоторые дополнительные элементы или нет.

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