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

时间:2018-02-26 03:12:54

标签: python list indexing replace find

我必须搜索列表中的所有元素,并将所有出现的一个元素替换为另一个元素。这样做的最佳方式是什么?

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

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

有更好的方法吗?

5 个答案:

答案 0 :(得分:2)

您的通用算法是正确的。

但是,data.index(“ - >”)只会找到第一次出现“ - >”的索引。

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

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

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

答案 1 :(得分:1)

正确地指出,<ul> <li><a href="{{route('products')}}">Woman</a> <ul> @foreach ($show as $shows) <li><a href="{{route('productbyid')}}" {{$shows['name']}}</a></li> @endforeach </ul> </li> <li><a href="./products.html">Man</a></li> </ul> 只会返回元素第一次出现的索引。此外,您的代码不会删除data.index之前和之后的条目。

对于改变列表的解决方案,可以使用"=>",但我建议使用Python提供的这种巧妙的切片语法。

del

我还建议您尝试在单个传递中生成新列表的实现。改变列表可能是一种不好的做法,并且没有创建像这样的新列表的真正优势。

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

答案 2 :(得分:1)

由于@ alpha_989建议首先找到=>元素的索引并替换每次出现,希望这可能有所帮助

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

答案 3 :(得分:0)

下面是我的小实验,我添加了一个函数来调用。你可以检查一下:

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


def convert_list():
    ind = [i for i, x in enumerate(data) if x == "=>"]

    if ind == 0 or ind == len(data) - 1:
        print("Invalid element location")
        return

    new_data = []

    index_start = 0
    while index_start < len(data):
        for ind_index in ind:
            if index_start == ind_index -1:
                index_start += 3
                new_data.append(data[ind_index - 1] + data[ind_index] +data[ind_index + 1])

            new_data.append(data[index_start])
            index_start += 1

    return new_data

print(convert_list())

答案 4 :(得分:0)

首先保存需要删除的索引,然后删除。

delete_index=[]
for i,d in enumerate(data):
    if(d=="=>"):
        data[i]=data[i-1]+data[i]+data[i+1]
        delete_index.append(i-1)
        delete_index.append(i+1)
new_data=[]
for i,d in enumerate(data):
    if i not in delete_index:
        new_data.append(d)
print(new_data)