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列表,用匹配索引改变匹配项的值的主要内容,如果未能解决你的问题,请参考以下文章

python学习 - 列表操作

Python3.7之列表与元组

设置列表项的值时自定义适配器中的空指针异常

列表列表中的匹配索引 - 字典 - python

使用 regex_search 获取所有匹配项的索引?

利用正则来查找字符串中第n个匹配字符索引