Python列表,用匹配索引改变匹配项的值
Posted
技术标签:
【中文标题】Python列表,用匹配索引改变匹配项的值【英文标题】:Python lists, change the value of matching items with matching index 【发布时间】:2021-01-07 20:13:28 【问题描述】:如果我有
list1 = [1, 2, 3, 6]
list2 = [4, 3, 5, 6]
如何更改两个列表之间匹配的任何值?仅当索引也匹配时
想要的输出是
list1 = [1, 2, 3, 'match']
我在用这个
for idx,x in enumerate(list1):
if x in list2:
list1[idx] = 'match'
但这取代了 3 和 6
【问题讨论】:
【参考方案1】:使用zip
同时迭代两个列表并检查每个值,而不是使用in
:
list3 = ['match' if x == y else x for x, y in zip(list1, list2)]
在常规形式中是:
list3 = []
for x, y in zip(list1, list2):
if x == y:
list3.append(x)
else:
list3.append('match')
【讨论】:
这些都没有给我想要的输出 [1, 2, 3, match] 你确定你不是在看list3而不是list1吗?编辑 list1 是没有意义的,因为那是您的输入数据。 如果您真的想编辑 list1,只需将 list3 替换为 list1 并删除第二个示例中的第一行。【参考方案2】:这是实现相同结果的另一种方法:
list1 = ['match' if v == list2[k] else v for (k, v) in enumerate(list1)]
【讨论】:
这实际上根本不是最好的答案。 可能不会,但它比您的答案快大约 5%。但是,zip 方法更快。【参考方案3】:如果您将两个列表压缩在一起,您可以比较它们的项目 - 如果您想保留原始列表并可能编写比列表理解更容易混淆的代码,您可以执行以下操作:
list1 = [1, 2, 3, 6]
list2 = [4, 3, 5, 6]
for i, t in enumerate(zip(list1, list2)):
a, b = t # unpack the tuple t
if a == b:
list1[i]="match"
最后,list1
是[1, 2, 3, 'match']
。
【讨论】:
【参考方案4】:list(map(lambda a, b: a if a != b else 'match', list1, list2))
[1, 2, 3, 'match']
【讨论】:
以上是关于Python列表,用匹配索引改变匹配项的值的主要内容,如果未能解决你的问题,请参考以下文章