2017-02-19 30 views
1

Как заменить значения из определенных ключей в перечисленных словарях? Но замена должна происходить с условным (т. Е. Если в начале они имеют 2 цифры). Предпочтительно с пониманием списка/словаря.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 знака. Условие является широким и должно быть настроено на ваши нужды.

EDIT: предварительно Python 2.7 совместимый альтернативный (Dict постижений, когда не существовало):

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

Это прекрасно, что я искал. Благодарю. Я думал, что если мы сможем сделать это с повторением, но в любом случае я буду адаптироваться к моим потребностям. – 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