Python 列出必须找到多个值并替换为两个新值的位置
依据是:Python 列出必须找到多个值并替换为两个新值的位置,python,list,replace,Python,List,Replace,依据是: 我想迭代一定次数,每次我取一个列表,找到一个特定的值,用两个新值替换该值,并使新列表成为迭代中的内容 以下是我所拥有的: list1 = ['ad', 'sbe', 'k3', 'lm0'] list2 = ['sb', 'e', 'lm', '0'] list3 = [1, 3] list1是我要更改的列表 list2是我要替换的元素 list3是原始列表中我要替换的值的位置 理想情况下,输出如下所示: list1 = ['ad', 'sb', 'e', 'k3', 'lm', '
我想迭代一定次数,每次我取一个列表,找到一个特定的值,用两个新值替换该值,并使新列表成为迭代中的内容 以下是我所拥有的:
list1 = ['ad', 'sbe', 'k3', 'lm0']
list2 = ['sb', 'e', 'lm', '0']
list3 = [1, 3]
list1
是我要更改的列表list2
是我要替换的元素list3
是原始列表中我要替换的值的位置
理想情况下,输出如下所示:
list1 = ['ad', 'sb', 'e', 'k3', 'lm', '0']
这就是我所拥有的,但它最终变得太复杂,充满了错误,我想他们必须用一种更简单的方法来实现这一点。我也看过itertools,但没能做到我想要的
list4 = list1
count = 0
for i in range(int(len(list2)/2)):
del list4[int(list3[i]) + count]
for j in range(2):
if j == 1:
j = j + 1
list4.insert(int(list3[i]) + count, list2[(i + j)])
else:
list4.insert(int(list3[i]) + count, list2[(i + j)])
非常感谢您的帮助。您可以从头开始进行扩展,或者以下操作将起作用,从列表2中添加下两个元素如果当前索引位于我们从列表3创建的一组索引中,或者只保留原始元素,然后将所有元素合并到一个列表中:
In [1]: from itertools import chain
...: list1 = ['ad', 'sbe', 'k3', 'lm0']
...: list2 = ['sb', 'e', 'lm', '0']
...: list3 = [1, 3]
...: it = iter(list2) # create iterator so we can pull pairs
...: inds = set(list3) # create set from indexes list
...: list1[:]= chain(*([next(it), next(it)] if ind in inds else [ele] for in
...: d,ele in enumerate(list1)))
...:
In [2]: list1
Out[2]: ['ad', 'sb', 'e', 'k3', 'lm', '0']
或创建一个简单的生成器函数:
def inserts(l1, l2, indexes):
it, index_set = iter(l2), set(indexes)
for ind, ele in enumerate(l1):
if ind in index_set:
yield next(it)
yield next(it)
else:
yield ele
相同输出:
In [5]: list1 = ['ad', 'sbe', 'k3', 'lm0']
...: list2 = ['sb', 'e', 'lm', '0']
...: list3 = [1, 3]
...:
In [6]: list1[:] = inserts(list1, list2, list3)
...:
...: print(list1)
...:
['ad', 'sb', 'e', 'k3', 'lm', '0']
您可以将列表理解与筛选器一起使用:
sum([list2[i:i+2]if i in list3 else [v] for i,v in enumerate(list2)], [])
您可以循环并检查命令式版本:
res = []
for i,v in enumerate(list1):
if i in list3:
res += list2[i:i+2]
else:
res.append(v)
我处理这个问题的方法是首先通过将列表压缩在一起创建列表,然后通过一些简单的算法,决定从哪个索引删除元素。这是不可能的 考虑索引列表中出现重复值的可能性(此输入可通过
设置或边缘案例错误处理进行清理)
可能的解决方案:
def f(list1, list2, list3):
result=[]
for item_one, item_two in zip(list1,list2):
result.extend((item_one, item_two))
len_factor = float(len(result))/len(list1)
len_factor = len_factor if len_factor.is_integer() else int(len_factor) + 1
for index, item in enumerate(set(list3)):
del result[item * len_factor - index]
return result
调用方法f()
:
这与预期的输出完全不匹配,而且用sum整平列表也不是一个很好的方法。
list1 = ['ad', 'sbe', 'k3', 'lm0']
list2 = ['sb', 'e', 'lm', '0']
list3 = [1, 3]
print f(list1, list2, list3)
>>> ['ad', 'sb', 'e', 'k3', 'lm', '0']