Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列出必须找到多个值并替换为两个新值的位置_Python_List_Replace - Fatal编程技术网

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