2017-02-18 10 views
2

У меня есть два списка:Python 3: Как я могу проверить, если два списка совпадают, даже если элементы не в порядке

original_list= [1,2,3,4,5] 

new_list = [[1,7,3,4], [1,2,4,5,3]] 

Другие, чем при использовании сортировки, а затем список в списке, как я могу сравнить значения original_list находятся в new_list?

+0

сортировать элементы вашего списка, а не сам список. 'new_list = [отсортированный (x) для x в new_list]' должен сделать это. –

+0

Почему вы не хотите сортировать? Потому что он изменяет ваши исходные списки? Кроме того, если заказ не имеет значения для ваших коллекций, вы можете использовать 'set', а не списки. –

+1

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

ответ

3

Вы хотите отсортировать все list в new_list, а не new_list. Попробуйте, например, с помощью map:

print(sorted(original_list) in map(sorted, new_list)) 

или если вы заботитесь только о существовании одних и тех же элементов, независимо от их подсчета:

print(set(original_list) in map(set, new_list)) 
+0

Или 'sorted (original_list) на карте (отсортировано, new_list)' –

+0

каждый раз, когда 'map' используется специально в python 3 Я счастлив. –

+0

@ Jean-FrançoisFabre Вы имеете в виду, если это не раздражается каким-то выражением лямбда? – schwobaseggl

2

предположив свой первоначальный список уже отсортирован (если нет, то просто применить sort), вы должны сравнить каждый элемент - отсортированный - с помощью петли или any:

new_list = [[1,7,3,4],[1,2,4,5,3]] 
original_list= [1,2,3,4,5] 
original_list.sort() # optional if the list is not sorted yet 

print(any(sorted(x)==original_list for x in new_list)) 

печатает True если суб-список new_list имеет те же элементы, что и original_list

Это позволяет избежать переустановки исходного списка с помощью new_list = [sorted(x) for x in new_list], чтобы отсортировать товары, так как заказ может быть важен в конце концов.

0

Кроме sorted, который имеет O(n*log(n)) поведение во время выполнения (в худшем случае я думаю,) вы можете использовать collections.Counter (почти гарантированное поведение O(n) выполнения):

>>> from collections import Counter 
>>> lst_counts = Counter(original_list) 
>>> any(lst_counts == Counter(sublist) for sublist in new_list) 
True 

Это использует тот факт, что счетчик сравнить оба ключ и значение, и, следовательно, равен только если словари (внутри Counter) идентичны

Если вы можете исключить дубликаты, то вместо Counter вы можете также использовать set с.