Ищете элегантный способ найти пересечение между двумя списками кортежей слов в разных порядках

Я думаю, что лучше всего показать пример того, что я пытаюсь сделать. Дело в том, что я ищу элегантный способ сделать это.

Допустим, у меня есть два списка кортежей:

x = [('a', 'c', 'e'), ('k', 'n')]
y = [('e', 'd', 'w'), ('c', 'a', 'e'), ('n', 'k')]
z = set(x).intersection(y)

Если я вычислю пересечение между x и y, я получу пустое множество.

Моя цель - выяснить, что в y есть два элемента, которые идентичны двум элементам в x, в то время как меня не волнует разный порядок кортежей. Кроме того, я хочу получить индекс соответствующего элемента списка y.

Для меня x[0] и y[1] одинаковы (опять же, не заботятся о порядке), и индекс, который я хочу получить, равен 1, то же самое для x[1] и y[2], оба То же самое для меня, и он должен вернуть индекс 2 в этом случае.

Есть идеи, как сделать это элегантно?

1 ответ

Решение

Вы не можете сделать свой x а также ysets? Например:

x = [('a', 'c', 'e'), ('k', 'n')]
y = [('e', 'd', 'w'), ('c', 'a', 'e'), ('n', 'k')]
set_x = set(frozenset(a) for a in x)
set_y = [frozenset(a) for a in y]
[y_element in set_x for y_element in set_y]

возвращает: [False, True, True]

Если вы хотите фактические показатели:

[i for i, y_element in enumerate(set_y) if y_element in set_x]

возвращает: [1, 2]

Другие вопросы по тегам