在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哦,好吧,我补充了一些。