出于练习目的,我试图实现一个函数,该函数接收两个列表作为参数并返回它们之间的差。因此,基本上,列表中的元素并不相同。
我编写了以下函数:
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)
->基本上,两个代码似乎都可以工作,但是我目前面临的问题是,列表必须具有相同的长度才能使函数正常工作。如果长度不相同,则在列表1中添加例如100的整数,如果您打印函数,则不会显示为列表之间的差异。
我没有设法找到一种修改代码的方法,以至于列表的长度无关紧要。有人有想法吗?
谢谢!
答案 0 :(得分:3)
如果要对称差分,请使用^
运算符,而不要使用-
def difference(list1, list2):
return list(set(list1) ^ set(list2))
这里是将两个集合组合为一个集合的四个集合运算符。
一组或一组中的 |
union 元素
&
交集只有两个集合共有的元素
-
差异元素
^
对称差在两个集合中都没有,
我认为这是编写函数的更易读的方式
def symmetric_difference(a, b):
return {*a} ^ {*b}
(*将集合文字解压缩需要python 3.5或更高版本)
返回一个集合而不是一个列表,使它更清楚该函数的作用。输入参数可以是任何可迭代的类型,并且由于set是无序数据类型,因此返回set可以很明显地表明输入数据中的任何排序都没有保留。
>>> symmetric_difference(range(3, 8), [1,2,3,4])
{1, 2, 5, 6, 7}
>>> symmetric_difference('hello', 'world')
{'d', 'e', 'h', 'r', 'w'}
答案 1 :(得分:0)
两个版本都不对称:如果交换list1
和list2
,结果将不一样。
如果您在数字list2
中添加一个数字(而不是在问题中指出的list1
中),那么它就不会被视为差异,而是一个。
您要执行对称差异,因此无论两个列表中的数据(是否交换),结果都相同
def difference(list1,list2):
return list(set(list1).symmetric_difference(list2))
包含您的数据:
[1, 4, 7, 11]
答案 2 :(得分:-1)
尝试使用您的代码,无论列表的长度如何,它似乎都可以正常工作-当我在100
中添加list1
时,两个函数都显示出来了。
但是,您的代码似乎存在一些问题,可能会导致这些问题。首先,两个函数都接受参数list1
和list2
,但是这些变量与列表变量的名称相同。这似乎没有引起问题,但这意味着不再可以访问全局变量,通常最好的做法是通过对全局变量和函数中的变量使用不同的名称来避免混淆。
此外,您的函数不会采用对称差-它仅循环遍历第一个列表中的变量,因此不会计算第二个列表中的唯一变量。为了轻松解决此问题,您可以添加一条将您的列表组合成一个总和列表的行,然后遍历整个列表并检查每个值是否仅在列表之一中-这将使用^
来完成{{ 1}}比较变量是否在两个列表中,以便如果它仅在列表中的 中,则返回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
中。