我必须搜索列表中的所有元素,并将所有出现的一个元素替换为另一个元素。这样做的最佳方式是什么?
例如,假设我的列表包含以下元素:
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']
有更好的方法吗?
答案 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)