如何比较两个相同长度的列表并返回匹配项,非匹配项必须作为单个元素附加空格
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"]
答案 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 a
是Conditional Expression
,表示您想要的内容。 Conditional Expression
部分可以评估为值,最终将通过列表理解汇总到您想要的结果中。