基础是:
我想迭代一定次数,每次我拿一个列表,找到一个特定值,用两个新值替换该值,并使新列表进入迭代。
这就是我所拥有的:
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)])
非常感谢任何帮助。
答案 0 :(得分:1)
如果当前索引位于索引的 set 中,您可以从最后开始并执行扩展或以下操作,添加 list2 中的下两个元素从 list3 创建或只保留原始元素,然后将chain所有元素放入一个列表中:
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']
答案 1 :(得分:0)
我解决这个问题的方法是先将列表压缩在一起创建列表,然后用一些简单的算法决定从哪个索引中删除元素。这个不
考虑索引列表中重复值的可能性(此输入可以使用<div class="latest-work">
<span>latest work</span>
</div>
或边缘案例错误处理进行清理)
可能的解决方案:
set
调用方法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()
答案 2 :(得分:-1)
您可以使用list-comprehension with filter:
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)