2017-02-19 100 views
1

如何从列出的字典中的特定键替换值?但是替换应该在有条件的情况下发生(即如果它们在开始时有两位数字)。最好用列表/字典解释。Python:列出的字典,替换某些值

实施例:

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

我想从KEY3的值除去前两个数字。

回答

1

我会这样做,在列表理解中使用字典理解。

的字典解析重建词典,但改变了值,如果:

  • 关键是key3
  • 第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] 
+0

这正是我所期待的。谢谢。我在想如果我们可以用re.sub来做到这一点,但无论如何我会根据我的需求来调整。 – Twilight0

+0

这可以在python 2.7.X中使用,但是我在python 2.6.X中得到语法错误:( – Twilight0

+1

这是因为dict理解还没有提供,编辑替代解决方案,应该工作正常(给出相同的结果!!) –

1

有可能是一种方式与内涵要做到这一点,但在我看来,最好是有点更详细使代码的意图更加清晰:

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] 
0

所以我结合让·弗朗索瓦·法布尔的和汤姆·林奇的回答,稍微改变正则表达式图案以及与此想出了:

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