列表,其中必须找到多个值并替换为两个新值

时间:2016-07-25 22:50:47

标签: 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', '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)])

非常感谢任何帮助。

3 个答案:

答案 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)