3 回答
TA贡献1851条经验 获得超4个赞
您需要:
用一个
list
推导来创建一个新的list
并用它v
一次替换所有的内容,或者使用
enumerate
获得指数,以及项目,允许索引分配更新v
逐项
前者很简单:
for k, v in testDict.items():
# Replaces unconditionally, but that's fine, since it's a no-op otherwise
v[:] = [item.replace(" ***", "*") for item in v]
分配到v[:]用v新构造的list(然后丢弃)替换的全部内容。该[:]是必要的; 没有它,你只会重新绑定v到一个新的list,但唯一的list不会改变。
后者是对代码的较小更改:
for k, v in testDict.items():
for i, item in enumerate(v): # Get indices as we go
if " ***" in item:
v[i] = item.replace(" ***", "*") # Assign to index in v
或者,如果您需要item用于其他目的,您可以执行以下操作:
v[i] = item = item.replace(" ***", "*") # Assign to index in v
这样您就可以继续使用 的新值而item无需重复索引v。
请注意,列表理解对于方法#1 并不是绝对必要的(您可以按照自己喜欢的任何方式list通过 manual appends制作一个全新的,然后做v[:] = newlist),但它看起来更清晰,而且很明显 其v内容正在被交换对于原始v.
TA贡献1831条经验 获得超4个赞
该item变量仅保存 中每个项目的值的副本testDict,因此分配item不同的值不会影响 中的相应项目testDict。您应该为testDictby 索引分配一个新值:
for k, v in testDict.items():
for i, item in enumerate(v):
if " ***" in item:
v[i] = item.replace(" ***", "*")
TA贡献1852条经验 获得超7个赞
for k, v in testDict.items():
for i, item in enumerate(v):
if " ***" in item:
v[i] = item.replace(" ***", "*")
添加回答
举报