我想用数字替换字典中的字符串。我的词典是使用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'
修改
我文件中的字符串是随机文本,其中没有数字。它们完全是文本。
答案 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
迭代您的项目,并用这些索引替换键。