Python - различия между двумя списками - PullRequest
0 голосов
/ 24 октября 2018

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

Я кодировал следующие функции:

list1 = [4,2,5,3,9,11]
list2 = [7,9,2,3,5,1]

def difference(list1,list2):
    return (list(set(list1) - set(list2)))

difference(list1,list2)

AND

def difference_extra_credit(list1,list2):
    return [value for value in list1 if value not in list2]

difference(list1,list2)

-> В основном оба кода работают, но в настоящее время я сталкиваюсь с проблемой, заключающейся в том, чтосписки должны иметь одинаковую длину, чтобы функции могли работать.Если длина не совпадает, добавляя, например, целое число 100 к списку 1, она не будет отображаться как разница между списками, если вы печатаете функции.

Мне не удалось найти способ изменить код, чтобы длина списков не имела значения ... У кого-то есть идея?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Если вы хотите симметричную разность, используйте оператор ^ вместо -

def difference(list1, list2):
    return list(set(list1) ^ set(list2))

Вот четыре оператора набора, которые объединяют два набора в один набор.

| объединение : элементы в одном или обоих наборах

& пересечение : только элементы, общие для обоих наборов

- Разница : элементы в левом наборе, которые не в правом наборе

^ Симметричная разница : элементы в любом наборе, но не в обоих.

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

def symmetric_difference(a, b):
    return {*a} ^ {*b}

(* для распаковки в наборах литералов требуется python 3.5 или более поздняя версия)

Возвращение набора вместоСписок делает это немного более понятным, что делает функция.Входными аргументами могут быть любые итерируемые типы, и так как набор является неупорядоченным типом данных, возврат набора делает очевидным, что любой порядок во входных данных не был сохранен.

>>> symmetric_difference(range(3, 8), [1,2,3,4])
{1, 2, 5, 6, 7}
>>> symmetric_difference('hello', 'world')
{'d', 'e', 'h', 'r', 'w'}
0 голосов
/ 24 октября 2018

Испытывая ваш код, мне показалось, что он отлично работает независимо от длины списков - когда я добавил 100 к list1, он обнаружился для обеих разностных функций.

Однако,кажется, есть несколько проблем с вашим кодом, которые могут быть причиной проблем.Во-первых, вы принимаете аргументы list1 и list2 для обеих функций, но эти переменные имеют то же имя, что и список переменных.Похоже, это не вызывает проблемы, но это означает, что глобальные переменные более недоступны, и, как правило, лучше избегать путаницы, используя разные имена для глобальных переменных и переменных внутри функций.

Кроме того,Ваша функция не принимает симметричную разницу - она ​​только перебирает переменные в первом списке, поэтому уникальные переменные во втором списке не будут учитываться.Чтобы это легко исправить, вы можете добавить строку, объединяющую ваши списки в список сумм, затем циклически перебирать весь этот список и проверять, находится ли каждое значение только в одном из списков - для этого будет использоваться ^ для сравнения xorили нет, находится ли переменная в двух списках, так что она возвращает true, если она находится в только одном из списков.Это можно сделать так:

def difference_extra_credit(l1,l2):
    list  = l1 + l2
    return [value for value in list if (value in l1) ^ (value in l2)]

Проверка этой функции самостоятельно привела к появлению списка [4, 11, 7, 1] и [4, 11, 100, 7, 1], если 100 добавлено к list1 или list2.

0 голосов
/ 24 октября 2018

обе ваши версии не симметричны: если вы поменяете list1 и list2, результат не будет одинаковым.

Если вы добавите число в list2 (не в list1, как говорится в вашем вопросе), это не рассматривается как различие, тогда как оно равно единице.

Вы хотите выполнить симметричную разницу, поэтому независимо от данных в обоих списках (меняющихся местами)или нет) результат остается неизменным

def difference(list1,list2):
    return list(set(list1).symmetric_difference(list2))

с вашими данными:

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