Замена нескольких вхождений во вложенных массивах - PullRequest
3 голосов
/ 06 ноября 2008

У меня есть этот словарь Python "mydict", содержащий массивы, вот как это выглядит:

mydict = dict(
    one=['foo', 'bar', 'foobar', 'barfoo', 'example'], 
    two=['bar', 'example', 'foobar'], 
    three=['foo', 'example'])

Я хотел бы заменить все вхождения "example" на "someotherword".

Хотя я уже могу придумать несколько способов сделать это, есть ли самый «питонный» метод для достижения этой цели?

Ответы [ 3 ]

2 голосов
/ 07 ноября 2008

Если вы хотите оставить оригинал нетронутым и просто вернуть новый словарь с примененными изменениями, вы можете использовать:

replacements = {'example' : 'someotherword'}

newdict = dict((k, [replacements.get(x,x) for x in v]) 
                for (k,v) in mydict.iteritems())

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

for l in mydict.values():
    l[:]=[replacements.get(x,x) for x in l]

Однако это, вероятно, будет медленнее, чем решение Дж. Ф. Себастьяна , поскольку оно перестраивает весь список, а не просто изменяет измененные элементы на месте.

2 голосов
/ 06 ноября 2008
for arr in mydict.values():
    for i, s in enumerate(arr):
        if s == 'example':
            arr[i] = 'someotherword'
1 голос
/ 07 ноября 2008

Вот еще один дубль:

for key, val in mydict.items():
    mydict[key] = ["someotherword" if x == "example" else x for x in val]

Я обнаружил, что создание списков очень быстро, но, конечно, профиль, если производительность важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...