固定字典中的项目

时间:2019-04-02 16:12:54

标签: python python-2.7 dictionary replace iteration

假设我有一本字典,其中包含需要以某种方式解析或“修复”的项目:

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

3 个答案:

答案 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)

您需要:

  1. 使用a list comprehension创建一个新的list并使用它一次替换v的内容,或者
  2. Use 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的简单转换。