2015-07-13 2 views
-2

Я хочу заменить строки в словаре словарями. Мои словари создаются динамически с помощью from collections import defaultdict и они выглядят следующим образом:Python - Замена строки ключа внутри словаря

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 

Bu т он показывает следующее сообщение об ошибке:

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

Edit:

Строки в моем файле случаен текст и не имеет номера в нем. Они полностью тексты.

+2

Почему * «заменить текстовую строку на числовую строку» * ** затем ** конвертировать, а не просто использовать целое число как прямую замену? Какой * "весь документ" *? Каковы правила для поворота, например. ''car1''' '1'' (буквально только номер, который заканчивается? Что делать, если есть несколько ключей с одинаковым номером?) Почему бы вам не сделать это, когда * создание * словаря, в отличие от сообщения -hoc? Здесь очень много информации. – jonrsharpe

ответ

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 для имитации поведения defaultdict в пределах OederedDict. затем просто перебирайте свои позиции с помощью enumerate и замените ключи на эти индексы.

+1

Как насчет '' car10''? – jonrsharpe

+0

В файле, который у меня есть, есть разные ярлыки, а не точно car1, car2 или car3. Я просто использовал его, чтобы показать пример. Позвольте мне переделать вопрос. – Dhruvify

+2

@DhruvJ так где именно цифры * исходят от * ?! – jonrsharpe

Смежные вопросы