为了账号安全,请及时绑定邮箱和手机立即绑定

修复字典中的项目

修复字典中的项目

月关宝盒 2021-12-26 15:23:50
假设我有一本字典,其中包含需要以某种方式解析或“修复”的项目: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?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您需要:

  1. 一个list推导来创建一个新的list并用它v一次替换所有的内容,或者

  2. 使用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.


查看完整回答
反对 回复 2021-12-26
?
慕容708150

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


查看完整回答
反对 回复 2021-12-26
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

for k, v in testDict.items():

  for i, item in enumerate(v):

    if " ***" in item:

        v[i] = item.replace(" ***", "*")


查看完整回答
反对 回复 2021-12-26
  • 3 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信