python比较两个列表并替换原始列表如果匹配

时间:2017-01-09 15:55:04

标签: python list python-3.x

我有两个包含字符串的列表。我想对base_list中的每个项目进行搜索,然后搜索custom list中任何值中前3个字符是否匹配。如果匹配,请将base_list中的原始值替换为custom_list中的原始值。如果没有匹配项,请保留原始值。

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

custom_list = ["abc321", "efg654"]

期望的输出:

modified_base_list = ["abc321", "cde123", "efg654", "ghi123"]

最后我还想把这个新的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 +行的列表,以找到更快的方法来执行此操作。

4 个答案:

答案 0 :(得分:1)

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

>>> 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上进行迭代,并且不会多次添加项目:

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

    if not found:
        modified_base_list.append(base)

您也可以在此处使用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)

答案 1 :(得分:0)

您可以使用包含生成器表达式的列表推导:

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']

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

答案 2 :(得分:0)

使用filter()尝试以下内容:

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)

<强>输出:

>>> res
['**abc321**', 'cde123', '**efg654**', 'ghi123']

答案 3 :(得分:0)

您可以使用list comprehensionmap的组合:

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

custom_list = ["abc321", "efg654"]

smaller_custom = [y[:3] for y in custom_list]

modified_base_list = ["**{}**".format(custom_list[smaller_custom.index(x[:3])]) if x[:3] in smaller_custom else x for x in base_list]
# ['**abc321**', 'cde123', '**efg654**', 'ghi123']

with open('output_data.txt','w') as outfile:
    outfile.write("\n".join(modified_base_list))

我希望这会有所帮助。