Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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_Replace - Fatal编程技术网

在Python中(可能)嵌套列表中查找并替换元素?

在Python中(可能)嵌套列表中查找并替换元素?,python,replace,Python,Replace,我有一个项目列表,它们可以任意嵌套,也可以不任意嵌套。我想替换列表中的一个元素。无论是哪种方式(嵌套还是非嵌套),我都将元素的索引位置存储在另一个列表中 下面是一个嵌套列表示例,我想用其他内容替换'xyz',比如123。我将'xyz'的位置存储在loc中: find='xyz' replace=123 nested=[['abc',1],['xyz',2]] print(loc) # [1,0] 使用loc如何用'xyz'替换123 下面是一个不值得注意的例子,我想做同样的替换: unnes

我有一个项目列表,它们可以任意嵌套,也可以不任意嵌套。我想替换列表中的一个元素。无论是哪种方式(嵌套还是非嵌套),我都将元素的索引位置存储在另一个列表中

下面是一个嵌套列表示例,我想用其他内容替换
'xyz'
,比如
123
。我将
'xyz'
的位置存储在
loc
中:

find='xyz'
replace=123
nested=[['abc',1],['xyz',2]] 
print(loc) # [1,0]
使用
loc
如何用
'xyz'
替换
123

下面是一个不值得注意的例子,我想做同样的替换:

unnested=['abc','xyz']
print(loc) # [1]
如果
loc
只有一个元素,则您只需执行以下操作:

*nest,element=loc
if not nest: 
    unnested[element]=replace
else: pass # need help with this part

是否有足够灵活的方法来处理这两种情况

好,因此给定
loc=[0,1]
您希望执行以下操作:

thing[0][1] = replace
或者给定
loc=[1]
您将执行

thing[1] = replace
或者,如果我们的数据过于复杂,并且
loc=[0,1,2,3,4,5,6,7]
您可能需要:

thing[0][1][2][3][4][5][6][7] = replace
在任何情况下,我们首先需要在最后一个元素之前查找每一层,我们可以在for循环中这样做:

*nest,element=[0,1,2,3,4,5,6,7]
layer = thing #start with the original object
for i in nest:
    layer = layer[i] #get an element from this layer
#now layer == thing[0][1][2][3][4][5][6]
layer[element] = replace

这在
loc
中只有一个项时也有效,因为在这种情况下,for循环在一个空序列上迭代,因此无需单独处理该情况

这与另一个答案相同,只是以功能方式走路径:

reduce(getitem, loc[:-1], nested)[loc[-1]] = replace
在Python 3中,您需要从
functools
导入。来自
操作员
模块。如果您只有列表,则可以使用
list.\uu getitem\uu


说明:
reduce
nested
开头,对于
loc[:-1]
中的每个值
i
,将其替换为
getitem(当前值,i)
。例如,如果
loc
[2,4,1,3]
,那么您将得到
getitem(getitem(getitem)(嵌套的,2,4),1)
。这与嵌套的[2][4][1]

相同,如果您只有具有元组或单个元素的列表,我们可以首先检测列表是否具有元组,并根据需要应用lambda函数替换元素

如果列表有不同类型的元组,我们需要添加额外的逻辑来识别它

find='xyz'
replace=123
mylist1=[('abc',1),('xyz',2)] # nests could be tuples or lists
mylist2=['abc','xyz']
replace_this = '123'

for mylist in mylist1,mylist2:

    for x in mylist:
        if (x[0],x[1]) in mylist:            
            modified = map(lambda (x, y): (x,y) if x!=find else  (replace_this,y) ,mylist)
            break
        else:            
            modified = map(lambda x: x if x!=find else  replace_this ,mylist)
            break

    print "modified list=", modified
输出:

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
modified list= [('abc', 1), ('123', 2)]
modified list= ['abc', '123']
>>> 

这不是嵌套列表,而是元组列表。元组是不可变的,所以在第一种情况下不能直接替换元素。没错,这是一个元组列表,我试图展示一个简单的结构来表达这个问题。显示更多的巢穴只会增加
loc
的长度。我将对其进行编辑,使其成为一个列表。注意:OP没有指定Python版本(只有一个参数的
print
在这两个版本上都是等效的,更不用说
\uuuuuuuuuuuuuuuuuuuuuuuuu
可以使其成为Py2上的函数)<代码>*nest,元素=[0,1,2,3,4,5,6,7]仅在Py3中合法,而不是Py2。在Py2上,使用名为
foo
的源代码列表,您可以执行以下操作:
nest=foo[:]
element=nest.pop()
nest,element=foo[:-1],foo[-1]
。由于op在他们的问题中使用了该符号,我假设它在他们使用的python版本中有效;)哎呀。错过了。继续,先生!:-)只有当每一层都是列表时,这才有效,如果某些层有元组/其他结构,这将不起作用。可能不是问题,但这个问题最初是使用元组发布的,因此可能与OP的用例相关。@Tadhgmandald Jensen好吧,我现在就回答这个问题。在编辑之前,标题上只写了“列表”。你的作品也不适用于原作,就像你说的,这甚至有点不可能。无论如何,我添加了一个更通用的版本,它看起来更好。谢谢:-)@StefanPochmann你介意为这项工作添加一些解释吗?@LMc嗯,我想是的,说它与另一个答案的作用相同。看了之后还不清楚吗?@LMc哦,好吧,我补充了一些。