如何在python中比较列表并返回匹配和不匹配?

时间:2019-06-21 02:28:40

标签: python list

如何比较两个相同长度的列表并返回匹配项,非匹配项必须作为单个元素附加空格

l1=["a","b","c"]
l2=["a","d","c"]

result=[]
for i in l1:
    for j in l2:
        if i == j:
            match = i
            result.append(match)
        else:
            non_match = i + " "+ j
            result.append(non_match)

print(result)

Actual Output:
['a', 'a d', 'a c', 'b a', 'b d', 'b c', 'c a', 'c d', 'c']

Expected Output:
["a","b d","c"]

5 个答案:

答案 0 :(得分:2)

只要输出中项目的顺序无关紧要,就可以这样做:

Output = list(map(lambda x: " ".join(set(x)), zip(List1, List2)))

>>> Output
['a', 'd b', 'c']

逻辑可以按以下方式分解:

1:zip一起列出了两个列表:

# display the zipped lists:
>>> list(zip(List1, List2))
[('a', 'a'), ('b', 'd'), ('c', 'c')]

2:将结果列表中的每个元组变成一个集合(以获取唯一值):

# display the result of calling set on the zipped lists
>>> list(map(set, zip(List1, List2)))
[{'a'}, {'d', 'b'}, {'c'}]

3:将每个集合的成员与join

连接
Output = list(map(lambda x: " ".join(set(x)), zip(List1, List2)))

答案 1 :(得分:0)

遍历两个列表,如果相应的元素彼此不相等,则在其后添加一个空格和List2元素。

[List1[i] + (f" {List2[i]}" if List1[i] != List2[i] else '') for i in range(len(List1))]

为了完整性,我还将添加@grind的答案。我认为我们俩都喜欢它。如前所述,它不需要索引,格式也包括左右连接,我也认为这是一种改进。

[left if left == right else f'{left} {right'} for left, right in zip(List1, List2)]

如果两个列表的长度不同,则第一个将引发IndexError。第二个将产生一个新列表,其长度等于两个输入列表中的较短者。

答案 2 :(得分:0)

您也可以使用collections.Counter()

from collections import Counter

l1 = ["a", "b", "c"]
l2 = ["a", "d", "c"]

union = Counter(l1 + l2)
unique, difference = list(), list()
for k, v in union.items():
    if v == 1:
        difference.append(k)
    else:
        unique.append(k)
unique.append(' '.join(difference))
result = sorted(unique)
print(result)

答案 3 :(得分:0)

其他答案告诉其他方法,但我解决了您的问题。您的代码存在问题是因为您在Python列表中完全运行了两次。您可以在此处使用python中的zip函数。我已经为您解决了您的代码。

l1=["a","b","c"]
l2=["a","d","c"]

result=[]
for i,j in zip(l1, l2):
    if i == j:
        match = i
        result.append(match)
    else:
        non_match = i + " "+ j
        result.append(non_match)

print(result)

答案 4 :(得分:0)

尝试:

[' '.join((a, b)) if a != b else a
 for a, b in zip(l1, l2)]

zip(l1, l2)可以让您同时迭代l1, l2''.join((a, b)) if a != b else aConditional Expression,表示您想要的内容。 Conditional Expression部分可以评估为值,最终将通过列表理解汇总到您想要的结果中。