【问题标题】:Python: listed dictionaries, replace certain valuesPython:列出字典,替换某些值
【发布时间】:2017-07-09 00:58:27
【问题描述】:

如何替换列出字典中特定键的值?但是替换应该是有条件的(即,如果它们的开头有 2 个数字)。最好使用列表/字典理解。

例子:

a_list = [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': '20 title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': '10 title2'}]

我想从 key3 的值中删除前两位。

【问题讨论】:

    标签: python list dictionary list-comprehension python-2.6


    【解决方案1】:

    我会在列表推导中使用字典推导来做到这一点。

    字典推导会重建字典,但在以下情况下会改变值:

    • 键是key3 AND
    • 字符串的前 2 个字符是数字

    改变占据了前导空间的正确部分。

    a_list = [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': '20 title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': '10 title2'}]
    
    a_new_list = [{k:v.partition(" ")[2] if (k=="key3" and v[:2].isdigit()) else v for k,v in d.items()} for d in a_list]
    
    print(a_new_list)
    

    结果:

    [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': 'title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': 'title2'}]
    

    注意:如果多于 2 位,也会删除前几位。条件很广泛,应根据您的需要进行调整。

    编辑:兼容 Python 2.7 之前的替代方案(不存在时的字典推导):

    a_new_list = [dict((k,v.partition(" ")[2] if (k=="key3" and v[:2].isdigit()) else v) for k,v in d.items()) for d in a_list]
    

    【讨论】:

    • 这正是我想要的。谢谢。我在想我们是否可以使用 re.sub 来做到这一点,但无论如何我都会根据自己的需要进行调整。
    • 这适用于 python 2.7.X,但是我在 python 2.6.X 中遇到语法错误:(
    • 那是因为字典推导还不可用。为替代解决方案编辑,应该可以正常工作(给出相同的结果!!)
    【解决方案2】:

    所以我结合了 Jean-François Fabre 和 Tom Lynch 的答案,稍微改变了正则表达式的模式并想出了这个:

    import re
    
    a_new_list = [{k: re.sub(r'^\d{2} ', '', d[k]) if k == "key3" else v for k, v in d.items()} for d in a_list]
    
    print a_new_list
    

    【讨论】:

      【解决方案3】:

      可能有一种方法可以通过推导来做到这一点,但我认为最好稍微冗长一点,以使代码的意图更清晰:

      import re
      
      for d in a_list:
          for k in d:
              d[k] = re.sub(r'^\d\d', '', d[k]) if k == 'key3' else d[k]
      

      【讨论】: