修复字典中的项目

2024-09-27 21:28:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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'。我现在的问题是,如何在{}中用新的{}替换旧的{}


Tags: infor字典方式itemcountyforestjohnson
3条回答

item变量只保存testDict中每个项的值的副本,因此为item分配不同的值对testDict中的相应项没有影响。您应该通过索引为testDict指定一个新值:

for k, v in testDict.items():
    for i, item in enumerate(v):
        if " ***" in item:
            v[i] = item.replace(" ***", "*")
for k, v in testDict.items():
  for i, item in enumerate(v):
    if " ***" in item:
        v[i] = item.replace(" ***", "*")

您需要:

  1. 使用a ^{} comprehension创建一个新的list,并使用它一次替换v的所有内容,或者
  2. Use ^{}获取索引和项目,允许索引分配逐项更新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并不是绝对必要的(您可以通过手动append以任何您喜欢的方式创建一个全新的list,然后执行v[:] = newlist),但是v的内容被替换为原始v的简单转换,这看起来更干净,而且很明显

相关问题 更多 >

    热门问题