2013-11-13 4 views
2

У меня есть словарь, который выглядит как:Найти и заменить строки в словаре питона

d = {'alleged': ['truths', 'fiels', 'fact', 'infidelity', 'incident'], 
'greased': ['axle', 'wheel', 'wheels', 'fields', 'enGine', 'pizza'], 
'plowed': ['fields', 'field', 'field', 'incident', '', '']} 

Я хотел бы пойти по ней и заменить некоторые элементы для других строк. Струны быть найти и те, чтобы заменить их также в словаре, в котором ключ является строка, которая будет найдена и значение является строкой, чтобы заменить его:

d_find_and_replace = {'wheels':'wheel', 'Field': 'field', 'animals':'plants'} 

Я пытался использовать функцию как:

def replace_all(dic1, dic2): 
    for i, j in dic.items(): 
     dic3 = dic1.replace(i, j) 
    return(dic3) 

, но это не будет работать, потому что, очевидно, он использует заменить встроенную функцию replace внутри него, и это не представляется возможным использовать его для словарей. Любые предложения о том, как это сделать? Большое спасибо за любую помощь.

Отредактировано для исправления орфографических ошибок.

+2

вашего 'd_find_and_replace 'dict - это немного беспорядок. Убедитесь, что ваши котировки находятся в нужных местах. – roippi

+1

Ваш словарь 'd' также имеет несколько ошибок (нет открывающей цитаты на' alleged', закрыть скобку внутри списка «grealed»). Очистите их, чтобы они работали сначала, тогда вы можете отлаживать замену. – beroe

ответ

3

Попробуйте только с помощью прямого ассигнования:

for key in d: 
    li = d[key] 
    for i,item in enumerate(li): 
     li[i] = d_find_and_replace.get(item, item) 
+0

Большое вам спасибо. Это распространяется только на линию словарей. Может быть, нужно включить понимание списка? – user2962024

+0

@ пользователь2962024 erm. Я не следую. Это проходит через каждый 'ключ' в' d' и выполняет операцию 'find_and_replace' для каждого элемента списка для этого ключа. Вы хотите создать новый 'dict' вместо мутирования' d' на месте? – roippi

+0

Еще раз спасибо за ваше время. Извините, я что-то испортил, но теперь понял. Очень приятное решение! Я действительно благодарю вас за это! – user2962024

0

вот решение. Я также исправил словари, они были грязными. Проверьте свое правописание, потому что с этими ключами я думаю, что будет только одно совпадение, которое будет заменено. например engine никогда не будет соответствовать enGine, если вы не заботитесь, чтобы соответствовать более низкому или верхнему регистру, в этом случае вы можете использовать if val.lowercase()

d = {'alleged': ['truths', 'fiels', 'fact', 'infidelity', 'incident'], 
    'greased': ['axle', 'wheel', 'wheels', 'fields', 'enGine', 'pizza'], 
    'plowed': ['fields', 'field', 'field', 'incident', '', '']} 

d_find_and_replace = {'fields': 'field', 'engine': 'engine', 'incidint':'incident'} 

keys_replace = d_find_and_replace.keys() 
print d 
for key in d.keys(): 
    for i, val in enumerate(d[key], 0): 
     if val in keys_replace: 
      index_to_replace = keys_replace.index(val) 
      d[key][i] = d_find_and_replace[keys_replace[index_to_replace]] 

print d 
+0

Спасибо за ваше решение, но я думаю, что это python 2, не так ли? Я получаю сообщение об ошибке: AttributeError: объект «dict_keys» не имеет атрибута «index», знаете ли вы, что эквивалентно для python 3.2? Еще раз спасибо! – user2962024

+0

Я не использовал никаких 'dict_keys' в коде, который я разместил. Вы можете отредактировать свой ответ с кодом, который дает вам ошибку. – jramirez

+0

Сделано, отредактирован вопрос и вставлен весь код. – user2962024

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