我想编写一个能够区分列表的函数。 例如,
list1 = ['a','a','a','b','c','d','d']
list2 = ['a','a','a','b','c','a','d']
list = diff(list1, list2)
print(list)
列表应为['d','a']
,两者中不匹配的元素。
我想过使用set但它不会起作用,因为它会消除重复的字符。
答案 0 :(得分:1)
我的两个列表都有相同的长度,您可以使用zip
:
res = []
for x, y in zip(list1, list2):
if x != y:
res.extend((x, y))
print(res)
输出:
['d', 'a']
或者作为单行:
>>> [z for x, y in zip(list1, list2) if x != y for z in (x, y)]
['d', 'a']
如果两个列表的长度不同,并且您希望将其计为差异,则可以使用zip_longest
:
from itertools import zip_longest
list1 = ['a','a','a','b','c','d','d', 'x']
list2 = ['a','a','a','b','c','a','d']
res = []
for x, y in zip_longest(list1, list2):
if x != y:
res.extend((x, y))
print(res)
输出:
['d', 'a', 'x', None]
再次作为单行
>>> [z for x, y in zip_longest(list1, list2) if x != y for z in (x, y)]
['d', 'a', 'x', None]
答案 1 :(得分:0)
假设两个列表的长度相同
def diff(l,m):
ans = []
for i in range(len(l)):
if l[i]!=m[i]:
ans.append(l[i])
ans.append(m[i])
return ans
我在代码中所做的是我迭代列表的每个元素并检查它们是否相等。如果它们相同则没有任何反应,循环进入下一次迭代,如果它们不相同,则两个元素都附加到ans
列表。
答案 2 :(得分:0)
您可以使用单行list-comprehension
:
[e for i, j in zip(list1, list2) if i != j for e in (i, j)]
给出:
['d', 'a']
<强>为什么吗
首先,我们需要了解zip()
函数的功能,这可以通过一个示例看出:
>>> list(zip([1,2], [3,4]))
[(1, 3), (2, 4)]
正如你所看到的那样,简单地说就是&#34;拉链&#34;两个lists
在一起(请注意zip
适用于任何iterable
,而不只是lists
。
然后我们想要遍历这些tuples
和解包中的每一个,以便我们可以使用这两个元素。
接下来,我们检查两个元素 与i != j
是否相同。这意味着我们现在只使用变量i
和j
,如果它们不同。
最后,由于您的预期输出需要展平列表,我们需要使用另一个loop
添加i
和j
作为单独的元素我们正在创建的list
。
请注意,这取决于两个列表的长度与zip()
在最短的列表末尾的停靠时间相同。
答案 3 :(得分:0)
使用itertools
和zip()
功能成对过滤:
import itertools
list1 = ['a','a','a','b','c','d','d']
list2 = ['a','a','a','b','c','a','d']
result = list(itertools.chain.from_iterable(
itertools.filterfalse(lambda x: x[0] == x[1], zip(list1, list2))))
print(result)
输出:
['d', 'a']