使用python查找并替换列表中的某些元素

2024-04-20 13:01:21 发布

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

我必须搜索列表中的所有元素,并用另一个元素替换一个元素的所有匹配项。最好的方法是什么?你知道吗

例如,假设我的列表包含以下元素:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt',
        '=>',
        'text/CommitTest.txt',
        '0',
        'README.md',
        '=>',
        'text/README.md',
        '0']

我需要用字符“=>;”前后元素的组合值替换所有出现的字符“=>;”,因此我需要的输出是:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt=>text/CommitTest.txt',
        '0',
        'README.md=>text/README.md',
        '0']

这是我迄今为止写的代码:

ind = data.index("=>")
item_to_replace = data[ind]
combine = data[ind-1]+data[ind]+data[ind+1]
replacement_value = combine
indices_to_replace = [i for i,x in enumerate(data) if x==item_to_replace]

for i in indices_to_replace:
    data[i] = replacement_value

data

但是,不需要的输出如下所示:

data = ['a34b3f8b22783cf748d8ec99b651ddf35204d40c',
        'baa6cb4298d90db1c375c63ee28733eb144b7266',
        'CommitTest.txt',
        'CommitTest.txt=>text/CommitTest.txt',
        'text/CommitTest.txt',
        '0',
        'README.md',
        'CommitTest.txt=>text/CommitTest.txt',
        'text/README.md',
        '0']

有更好的办法吗?你知道吗


Tags: totextgttxt元素列表data字符
3条回答

正如@alpha_所建议的,首先找到=>元素的索引并替换每一个发生的元素,希望这能有所帮助

>>> indices = [i for i, x in enumerate(data) if x == "=>"]
>>> for i in indices: #this will add one index upper and one index lower of elem "=>" with elem
        data[i-1] = data[i-1]+ data[i] + data[i+1] 
>>> for elem in data:
        if elem == "=>":
            del data[data.index("=>")+1]
            del data[data.index("=>")]
>>> data
['a34b3f8b22783cf748d8ec99b651ddf35204d40c', 'baa6cb4298d90db1c375c63ee28733eb144b7266', 'CommitTest.txt=>text/CommitTest.txt', '0', 'README.md=>text/README.md', '0']

你的一般算法是正确的。你知道吗

但是,数据索引(“->;”)将只查找“->;”第一次出现的索引。你知道吗

您需要找到所有出现的“=>;”将其存储在一个列表中,合并元素并替换每个出现的元素。你知道吗

要查找“=>;”的所有出现的索引,可以使用:

indices = [i for i, x in enumerate(data) if x == "=>"]

有人正确地指出,data.index只返回元素第一次出现的索引。此外,代码不会删除"=>"之后和之前的条目。你知道吗

对于改变列表的解决方案,可以使用del,但我建议使用Python提供的这种整洁的切片语法。你知道吗

indices = [i for i, val in enumerate(data) if val == '=>']

for i in reversed(indices):
    data[i-1: i+2] = [data[i-1] + data[i] + data[i+1]]

我还建议您尝试在一次传递中生成一个新列表的实现。改变列表可能是一种不好的做法,与创建这样的新列表相比没有真正的优势。你知道吗

new_data = []
i = 0

while i < len(data):
    if i + 1 < len(data) and data[i + 1] == "=>":
        new_data.append(data[i] + data[i+1] + data[i+2])
        i += 3
    else:
        new_data.append(data[i])
        i += 1

相关问题 更多 >