Имея словарь, который { k1: v1, k2: v2 ... }
я хочу получить, { k1: f(v1), k2: f(v2) ... }
я передаю функцию f
.
Есть ли такая встроенная функция? Или я должен сделать
dict([(k, f(v)) for (k, v) in my_dictionary.iteritems()])
В идеале я бы просто написал
my_dictionary.map_values(f)
или
my_dictionary.mutate_values_with(f)
То есть для меня не имеет значения, мутирован ли оригинальный словарь или создана копия.
python
dictionary
map-function
Тарраш
источник
источник
dict((k, f(v)) for k, v in mydict.iteritems())
, то есть без квадратных скобок, который предотвратил бы создание промежуточного списка через генератор.Ответы:
Там нет такой функции; самый простой способ сделать это состоит в том, чтобы использовать сложное понимание:
В python 2.7 используйте
.iteritems()
метод вместо того,.items()
чтобы экономить память. Синтаксис распознавания текста не был введен до Python 2.7.Обратите внимание, что в списках такого метода тоже нет; Вы должны будете использовать понимание списка или
map()
функцию.Таким образом, вы также можете использовать эту
map()
функцию для обработки вашего dict:но это не так читаемо, правда.
источник
dict(zip(a, map(f, a.values())))
немного короче, но я должен подумать о том, что он делает, и напомнить себе, что да, ключи и значения перебираются в том же порядке, если dict не меняется. Мне совсем не нужно думать о том, что делает dictcomp, и это правильный ответ.my_dictionary.__getitem__
вызовы количества ключей .lambda (k,v): (k, f(v))
их следует переписать в нечто вродеlambda k_v: (k_v[0], f(k_v[1]))
Эти инструменты отлично подходят для такой простой, но повторяющейся логики.
http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap
Получает вас там, где вы хотите быть.
источник
Вы можете сделать это на месте, а не создавать новый dict, который может быть предпочтительным для больших словарей (если вам не нужна копия).
результаты,
my_dictionary
содержащие:источник
mapdict
вmutate_values_with
или что - то , чтобы сделать его кристально ясно , что вы переписать Dict! :)zip(d.keys(), d.values())
работает для большего количества версий вместоiteritems()
{k:f(v) for k,v in iter(d.items())}
Из-за PEP-0469, который переименовал iteritems () в items (), и PEP-3113, который удалил распаковку параметров Tuple , в Python 3.x вы должны написать Martijn Pieters ♦ ответ так:
источник
Хотя мой первоначальный ответ упустил из виду (пытаясь решить эту проблему с помощью решения Доступ к ключу в фабрике defaultdict ), я переработал его, чтобы предложить реальное решение для настоящего вопроса.
Вот:
Использование:
Идея состоит в том, чтобы создать подкласс исходного диктанта, чтобы придать ему желаемую функциональность: «сопоставить» функцию со всеми значениями.
Плюсом является то, что этот словарь можно использовать для хранения исходных данных, как если бы они были
dict
, при преобразовании любых данных по запросу с помощью обратного вызова.Конечно, не стесняйтесь называть класс и функцию так, как вы хотите (имя, выбранное в этом ответе, вдохновлено
array_walk()
функцией PHP ).Примечание: ни блок
try
-,except
ниreturn
операторы не являются обязательными для функциональности, они предназначены для дальнейшего имитации поведения PHParray_walk
.источник
__missing__
метод не будет вызываться для существующих ключей, которые мы хотим преобразовать, если только переданный фабричный метод не использует каким-либо образом исходный dict как запасной вариант, но поскольку это не является частью примера использования, Я считаю это неудовлетворительным ответом на имеющуюся проблему.Given a dictionary { k1: v1, k2: v2 ... } ...
. То есть у вас уже естьdict
для начала ..{v1: f(v1), v2: f(v2), ...}
заданное[v1, v2, ...]
, а не заданное. Я отредактирую свой ответ, чтобы исправить это.Чтобы не выполнять индексацию изнутри лямбда, например:
Вы также можете сделать:
источник
lambda(k,v)
не будет работать. См. Stackoverflow.com/questions/21892989/…Просто наткнулся на этот вариант использования. Я реализовал ответ gens , добавив рекурсивный подход для обработки значений, которые также являются dicts:
Это может быть полезно при работе с файлами json или yaml, которые кодируют строки как байты в Python 2
источник