列表中的差异

时间:2018-01-20 10:13:56

标签: python python-3.x

我想编写一个能够区分列表的函数。 例如,

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但它不会起作用,因为它会消除重复的字符。

4 个答案:

答案 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是否相同。这意味着我们现在只使用变量ij,如果它们不同

最后,由于您的预期输出需要展平列表,我们需要使用另一个loop添加ij作为单独的元素我们正在创建的list

请注意,这取决于两个列表的长度与zip()在最短的列表末尾的停靠时间相同。

答案 3 :(得分:0)

使用itertoolszip()功能成对过滤:

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']