Получите необычные предметы между 2 списками - PullRequest
2 голосов
/ 07 мая 2020

У меня есть 2 списка 'a1' и 'a2':

a1 = [[1, 4], [1, 10], [2, 5], [2, 11], [3, 6], [4, 7], [4, 12], [5, 8], [5, 13], 
      [6, 9], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], [6, 13], [8, 14], [9, 15]]

a2 = [[1, 10], [2, 11], [4, 12], [5, 13], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], 
      [6, 13], [8, 14], [9, 15]]

Я хочу создать третий список, содержащий необычные элементы между в двух предыдущих списках у меня должно получиться что-то вроде этого. Проблема в том, что он работает для 2-х списков, а не для 2-х списков, как в этом случае.

Есть ли эффективное решение для этого типа случая? С уважением.

Ответы [ 4 ]

1 голос
/ 07 мая 2020

Вы можете использовать понимание списка, которое проверяет, существуют ли элементы из a1 в установленной версии a2. Поскольку списки не хешируются, мы можем использовать вместо них кортежи.

# Convert a2 elements to a set of tuples
a2_set = {tuple(sublst) for sublst in a2}

# Use a list comprehension to filter the elements from a1 that don't exist in a2
difference = [sublst for sublst in a1 if tuple(sublst) not in a2_set]

print(difference)

Вывод:

[[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]

Если нас не заботит порядок (наборы неупорядочены), мы можем преобразовать a1 и a2 для наборов кортежей и применить различие наборов с помощью a - b или a.difference(b):

print(a1_set - a2_set)
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}

print(a1_set.difference(a2_set))
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}

Мы также можем превратить эти результаты во вложенные списки, используя списки:

print([list(tup) for tup in a1_set - a2_set])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]

print([list(tup) for tup in a1_set.difference(a2_set)])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]

Однако, если вам нужна симметрия c разница , как описано в документах:

Возвращает новый набор с элементами либо в наборе, либо в других, но не оба.

Мы можем вычислить симметрию c разность, используя a ^ b или a.symmetric_difference(b):

a1_set = {tuple(sublst) for sublst in a1}
a2_set = {tuple(sublst) for sublst in a2}

print(a1_set ^ a2_set)
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}

print(a1_set.symmetric_difference(a2_set))
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}

Который также может быть преобразован из набора кортежей в вложено с использованием списков:

print([list(tup) for tup in a1_set ^ a2_set])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]

print([list(tup) for tup in a1_set.symmetric_difference(a2_set)])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]
1 голос
/ 07 мая 2020

Ваш код будет работать, если вы определите a1 и a2 как наборы кортежей:

a1 = {(1, 4), (1, 10), (2, 5), (2, 11), (3, 6), (4, 7), (4, 12), (5, 8), (5, 13), (6, 9), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
a2 = {(1, 10), (2, 11), (4, 12), (5, 13), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
a3 = a1.difference(a2)
print(a3)
1 голос
/ 07 мая 2020
[x for x in a1 if x not in a2]
0 голосов
/ 07 мая 2020

Я думаю, вы могли бы выполнить это для списков, прежде чем применять разницу функцию

a1 = set(tuple(pair) for pair in a1)

, и тогда вы можете достичь того, что пытаетесь

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