Python:列出字典,替换某些值

Python: listed dictionaries, replace certain values

如何替换列出的字典中特定键的值?但是替换应该有条件地发生(即如果它们的开头有 2 位数字)。最好有 list/dictionary 理解。

示例:

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

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

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

字典理解重建字典,但在以下情况下更改值:

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

改变是取前导的右边部分 space。

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]

可能有一种方法可以通过理解来做到这一点,但在我看来,最好更详细一点以使代码的意图更清晰:

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]

所以我结合了 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