python比较两个列表,如果有匹配项,则替换原始列表

2024-05-22 09:36:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个包含字符串的列表。我想获取base_list中的每一项,并搜索该custom list中的任何值中的前3个字符是否匹配。如果存在匹配项,请将base_list中的原始值替换为custom_list中的值。如果没有匹配项,则保留原始值。在

base_list = ["abc123", "cde123", "efg456", "ghi123"]

custom_list = ["abc321", "efg654"]

期望输出:

^{pr2}$

最后,我还想将这个新的modified_base_list写成一个包含这些项的文件,每行一个。在

我试过:

modified_base_list = []

for custom in custom_list:
    for base in base_list:
        if custom[:3] == base[:3]:
            modified_base_list.append(custom)
        else:
            modified_base_list.append(base)


print(modified_base_list)

with open('newfile.txt', 'w') as f:
    for s in modified_base_list:
        f.write(s)

***编辑问题以说明包含15k+行的列表,以找到更快的方法。在


Tags: 字符串in列表forbasecustomlistmodified
3条回答

使用^{}尝试以下操作:

res = []

for i in base_list:
    temp = list(filter(lambda j: j[:3] == i[:3], custom_list))
    if temp:
        res.append('**{}**'.format(temp.pop()))
    else:
        res.append(i)

输出:

^{pr2}$

这是一个改变原始列表的解决方案,只替换那些存在所需匹配项的列表:

>>> base_list = ["abc123", "cde123", "efg456", "ghi123"]
>>> custom_list = ["abc321", "efg654"]
>>> for i, x in enumerate(base_list):
        for test in custom_list:
            if test[:3] == x[:3]:
                base_list[i] = test
                break

>>> base_list
['abc321', 'cde123', 'efg654', 'ghi123']

当然,如果不想修改原始列表,可以先使用modified_base_list = base_list[:]创建一个列表。在


您也可以遵循自己的想法,但在这种情况下,您必须确保主要是在base_list上迭代,并且不会多次添加项:

^{pr2}$

您也可以在这里使用for…else,而不是该实用程序变量found

for base in base_list:
    for custom in custom_list:
        if custom[:3] == base[:3]:
            modified_base_list.append(custom)
            break
    else:
        modified_base_list.append(base)

可以使用包含生成器表达式的列表理解:

base_list = ["abc123", "cde123", "efg456", "ghi123"]
custom_list = ["abc321", "efg654"] 
modified_base_list = [next((y for y in custom_list if y[:3] == x[:3]), x) for x in base_list]
# ['abc321', 'cde123', 'efg654', 'ghi123']

请注意,我假设相同的3个字符前缀在custom_list中多次出现,那么您只希望使用第一个实例。在

相关问题 更多 >