猿问

修复字典中的项目

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


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(" ***", "*")

这将返回,例如 item:'Sherwood*450184'而不是'Sherwood ***410273'。我现在的问题是,我该如何更换旧item与新item的testDict?


月关宝盒
浏览 200回答 3
3回答

繁花不似锦

您需要:用一个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.

慕容708150

该item变量仅保存 中每个项目的值的副本testDict,因此分配item不同的值不会影响 中的相应项目testDict。您应该为testDictby 索引分配一个新值:for k, v in testDict.items():    for i, item in enumerate(v):        if " ***" in item:            v[i] = item.replace(" ***", "*")

慕姐4208626

for k, v in testDict.items():  for i, item in enumerate(v):    if " ***" in item:        v[i] = item.replace(" ***", "*")
随时随地看视频慕课网APP

相关分类

Python
我要回答