Эффективный способ определить, совпадают ли элементы в двух списках - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь найти уникальные комбинации 4 из 32 вариантов (496 возможностей), которые затем объединяются в матрицу (так что матрица может быть до 496 на 496 или 25 000 ячеек). Однако (с использованием чисел для представления вариантов выбора) это означает, что у меня есть несколько дубликатов (1,2), сопоставленных с (3,4), то же самое, что (1,3), сопоставленные с (2,4). Что мне нужно сделать, так это найти дубликаты (те же четыре варианта, независимо от того, в каком порядке) и пометить их как таковые. Я поигрался с этим и прочитал все, что смог найти. В этом вопросе (https://www.csestack.org/compare-two-lists-python-return-non-match-elements/) я начал. Однако мои списки разные - они выглядят как элементы в list_e и list_f (см. Код ниже), которые не отображаются как дубликаты, даже если игроки 2,4,6 и 8 отображаются в каждом из них. В идеале я хотел бы найти способ сравнить list_e и list_f и зарегистрировать их как дубликаты. Если мне нужно переформатировать содержимое list_e и list_f, чтобы они имели ту же структуру, что и list_a и list_b, это, по крайней мере, выполнит свою работу. Однако, поскольку у меня много сравнений, я хотел бы сделать это наиболее эффективным способом.

Заранее спасибо за любую помощь.

    if len(list_a) != len(list_b):
        return False
    if set(list_a) == set(list_b):
        return True
    else:
        return False
         
 
list_a = [2, 4, 6, 8]
list_b = [2, 8, 6, 4]

list_c = [(2,4,6,8)]
list_d = [(4,6,2,8)]

list_e = [((2,4),(6,8))]
list_f = [((2,6),(4,8))]
 
if is_identical(list_a, list_b):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

    
if is_identical(list_c, list_d):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

if is_identical(list_e, list_f):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

1 Ответ

0 голосов
/ 03 августа 2020

Это удалит все скобки, отсортирует его и проверит, совпадают ли списки.

a = [((1,2),(3,4))]
b = [((1,3),(2,4))]
from collections import Iterable                            # < py38


def flatten(items):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            for sub_x in flatten(x):
                yield sub_x
        else:
            yield x
            
c = (list(flatten(a)))
d = (list(flatten(b)))
print(c.sort()==d.sort()) #True

Я дам некоторые пояснения здесь.

Итак, сначала вы повторяете через список, который передается в функции flatten.

Затем мы проверяем, можете ли вы перебирать список или нет, используя метод isinstance, например (syntax) => isinstance(4, Int) даст логическое значение т.е. True

yield дает значение того, что вы sh возвращаете, это часто путают с return, которое дает только логическое значение

На этом функция завершается. нам просто нужно сгладить предоставленный вами список, отсортировать его, используя .sort(), и сравнить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...