Эффективное сравнение списков в python - PullRequest
0 голосов
/ 11 марта 2020

Я хотел бы эффективно сравнить два списка и определить, имеют ли оба одинаковые элементы.

Списки могут быть None, пустыми и иметь различную длину. Порядок элементов внутри списка не имеет значения, поэтому ['a', 'b', 'c'] == ['a', 'c', 'b'] равны в моем случае.

Мое текущее решение выглядит так:

 def list_a_equals_list_b(list_a, list_b):
    if list_a != None and list_b != None:
        if len(list_a) != len(list_b):
            return False
        else:
            return len(frozenset(list_a).intersection(list_b)) == len(list_a)
    elif list_a == None and list_b == None:
        return True
    else:
        return False

Есть ли более эффективный способ сравнить эти списки?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Если у вас нет дубликатов ни в одном из списков, вы можете использовать набор:

if listA == listB  \
or listA and listB \
   and len(listA) == len(listB) \
   and not set(listA).symmetric_difference(listB):
   # lists have the same elements
else:
   # there are differences

Если вы разрешите дублирование, тогда вы можете использовать счетчик из коллекций (что также будет работать, если вы не дубликатов)

from collections import Counter

if listA == listB  \
or listA and listB \
   and len(listA) == len(listB) \
   and Counter(listA)==Counter(listB):
   # lists have the same elements
else:
   # there are differences
0 голосов
/ 11 марта 2020

Метод Counter () лучше всего подходит, если ваши объекты могут быть хэшируемыми. но вот встроенная функция sorted () - ваш лучший вариант.

def list_a_equals_list_b(list_a, list_b):
    return (list_a == None and list_b == None) or sorted(list_a) == sorted(list_b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...