Python &引用;蟒蛇的;就地替换列表中一个或多个项目的方法
我想就地替换列表中的一个或多个项目。我的直觉反应是这样的:Python &引用;蟒蛇的;就地替换列表中一个或多个项目的方法,python,python-2.7,list,Python,Python 2.7,List,我想就地替换列表中的一个或多个项目。我的直觉反应是这样的: mylist = [...] other_object = dict(spam='eggs', a_list=mylist) def replacer(item): ... contents not shown, returns a replacement ... mylist[:] = [replacer(item) for item in mylist] 它需要放在适当的位置,这样,如果我有其他对象(例如上面示例中的ot
mylist = [...]
other_object = dict(spam='eggs', a_list=mylist)
def replacer(item):
... contents not shown, returns a replacement ...
mylist[:] = [replacer(item) for item in mylist]
它需要放在适当的位置,这样,如果我有其他对象(例如上面示例中的other_object
)引用mylist,那么这些其他对象将看到更新的值。(澄清:我不想要求对其他对象
进行任何更改,因为它是在我维护的代码的其他地方进行管理的。)
这是Python中最惯用的方法吗?如果没有,还有更好的方法吗?我觉得你自己的解决方案很好:
mylist[:] = [replacer(item) for item in mylist]
或者,您可以用更明确但冗长的方式:
for idx, val in enumerate(mylist):
mylist[idx] = replacer(val)
我可以想象很多其他的方法,但是如果我建议他们你可以直接这么做,我会被烧死并被禁止下地狱:
>>> my_list=[1,2,3]
>>> other_obj={'eggs':my_list}
>>> my_other_list=[[1,2,3],my_list]
>>> other_obj['eggs'][:]=[e+2 for e in other_obj['eggs']]
>>> other_obj
{'eggs': [3, 4, 5]}
>>> my_other_list
[[1, 2, 3], [3, 4, 5]]
>>> my_list
[3, 4, 5]
请注意,在使用原始my_list
的任何位置,都会通过对这些名称中的任何一个使用切片指定来更改它:
>>> my_other_list[1][:]=[20,30,40]
>>> my_list
[20, 30, 40]
>>> other_obj
{'eggs': [20, 30, 40]}
更多关于Ned Batchelder的信息:
根据您的编辑:只需原地更改
mylist
,它将在使用mylist
的其他对象中更改(但不是mylist
的副本)。您可以使用任何进行就地修改的方法
例如:
>>> my_list[:]=['new','inserted','items']
其他两个对象也会发生变化:
>>> other_obj
{'eggs': ['new', 'inserted', 'items']}
>>> my_other_list
[[1, 2, 3], ['new', 'inserted', 'items']]
如果这些是“共享”对象,请小心,因为其他程序/进程可能会在您不知情的情况下更改名称引用。潜在的潜在漏洞。惯用的方法是不就地执行,而是返回一个新对象,您可以将其传递给关心它的对象。不,这是功能性的方法,而不是惯用的方法,我很想这样做,但在这种情况下我不能。mylist=[replacer(item)for item in mylist]为列表定义一个非常小的
类
包装器怎么样?然后,您可以运行类似于mylist.replace(function=replacer)
的方法,并相应地更改self.lst
属性。如何[mylist.\uuuu setitem\uuuuuu(i,replacer(item))for i,item in enumerate(mylist)]
?这两种方法都不会更新其他对象
,像OP request一样。@not_a_robot这些方法改变了列表,other_object
包含的列表。代码不必触碰other\u object
,更改就可以反映在那里。@not\u-robot为什么这么说?@not\u-robot正在创建一个新列表并将其分配给名称mylist
,而不是修改mylist
和other\u object['alist']
引用的原始列表。当你有疑问的时候,总是选择最可读的方式,如果你还在犹豫的话,就重读一遍