Python - 替换字典中的键字符串

时间:2015-07-13 10:19:30

标签: python dictionary

我想用数字替换字典中的字符串。我的词典是使用from collections import defaultdict动态创建的,它们如下所示:

comp1= defaultdict(list, {'carone': [('182', '511'), ('182', '511')],
                          'cartwo':[('140', '551'), ('192', '501')],
                          'carthree':[('130', '451'), ('292', '601')]} 

我想要的是什么:

我的目标是用数字字符串替换文本字符串,并将整个字典转换为整数,以提高执行速度。

comp1= defaultdict(list, {'1': [('182', '511'), ('182', '511')],
                          '2':[('140', '551'), ('192', '501')],
                          '3':[('130', '451'), ('292', '601')]}

我尝试了什么

我尝试了两种方法:

首先:

comp1 = {comp1:[comp1.replace("carone", "1") for k in comp1.items()]} #trying car1 first

第二

comp1.replace("carone", "1") #replacing car1 with '1' in entire document

但它显示以下错误:

AttributeError: 'collections.defaultdict' object has no attribute 'replace'

修改

我文件中的字符串是随机文本,其中没有数字。它们完全是文本。

1 个答案:

答案 0 :(得分:0)

您可以使用简单的词典理解,只需获取键的最后一个元素:

>>> from collections import defaultdict 
>>> 
>>> comp1= defaultdict(list, {'car1': [('182', '511'), ('182', '511')],
...                           'car2':[('140', '551'), ('192', '501')],
...                           'car3':[('130', '451'), ('292', '601')]} 
... 
... 
... )
>>> 
>>> {i[-1]:j for i,j in comp1.iteritems()}
{'1': [('182', '511'), ('182', '511')], '3': [('130', '451'), ('292', '601')], '2': [('140', '551'), ('192', '501')]}
>>> 

作为一种更通用的方式,它独立于数字后面的字符串和数字的长度,你可以使用正则表达式来提取最后的数字:

>>> import re
>>> 
>>> {re.search(r'\d+$',i).group():j for i,j in comp1.iteritems()}
{'1': [('182', '511'), ('182', '511')], '3': [('130', '451'), ('292', '601')], '2': [('140', '551'), ('192', '501')]}
>>> 

另一个例子:

>>> comp1= defaultdict(list, {'car01': [('182', '511'), ('182', '511')],
...                           'car25':[('140', '551'), ('192', '501')],
...                           'car123':[('130', '451'), ('292', '601')]} 
... )
>>> 
>>> {re.search(r'\d+$',i).group():j for i,j in comp1.iteritems()}
{'01': [('182', '511'), ('182', '511')], '123': [('130', '451'), ('292', '601')], '25': [('140', '551'), ('192', '501')]}
>>> 

编辑之后我必须说,由于字典项目没有排序,你不能做这样的事情,我建议使用OrderedDict使用dict.setdefault方法来模拟{{1}的行为在defaultdict内。然后使用OederedDict迭代您的项目,并用这些索引替换键。