假设我有一本字典,其中包含需要以某种方式解析或“修复”的项目:
testDict = {'05071': ['Clarksville*050112', 'Coal Hill*050315', 'Hartman*050251', 'Johnson County*050441'], '41067': ['Beaverton ***410240', 'Forest Grove ***410241', 'Hillsboro ***410243', 'King City ***410269', 'North Plains ***410270', 'Sherwood ***410273', 'Tualatin ***410277'],...}
我要用“ *”替换任何具有“ ***”的值列表项:
for k, v in testDict.items():
for item in v:
if " ***" in item:
item = item.replace(" ***", "*")
例如,将返回以下内容:'Sherwood*450184'
而不是'Sherwood ***410273'
。现在的问题是,如何在item
中用新的item
替换旧的testDict
?
答案 0 :(得分:1)
for k, v in testDict.items():
for i, item in enumerate(v):
if " ***" in item:
v[i] = item.replace(" ***", "*")
答案 1 :(得分:1)
item
变量仅保存testDict
中每个项目的值的副本,因此为item
分配不同的值将不会对{{1 }}。您应该改为通过索引为testDict
分配一个新值:
testDict
答案 2 :(得分:1)
您需要:
list
comprehension创建一个新的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
制作全新的append
,然后执行{{1} }),但看起来更加简洁,显然v[:] = newlist
的内容已被交换为原始v
的简单转换。