Имам вече създаден речник d
. Искам да променя само стойностите от определен тип. Например, искам да заменя низовете с техните дължини.
Скучният начин да направите това е с for цикъл:
for k,v in d.items():
if isinstance(v, str):
d[k] = len(v)
Но зациклянето не е ли бавно?
Може да се направи с разбиране. Мисля, че това е еквивалентно на горното:
d = {k: len(v) if isinstance(v, str) else v for k,v in d.items()}
Опитах го с карта, но те не работят (очевидно защото не разбирам нещо за разопаковането на кортежи в Python 3):
d = dict(map(lambda k,v: (k, len(v) if isinstance(v, str) else v), d.items()))
d = dict(map(lambda (k,v): (k, len(v) if isinstance(v, str) else v), d.items()))
Това изглежда работи, но става голямо и грозно:
dict(map(lambda kv: (kv[0], len(kv[1]) if isinstance(kv[1], str) else kv[1]), d.items()))
Изглежда, че този вид операция би била често срещана, но не мога да намеря конкретни отговори.
Какъв е правилният, Pythonic и производителен начин да го направите?
dict
разбиране е правилно и imho е питоничният начин да постигнете това. - person Cory Kramer   schedule 10.03.2018for
може би е по-бърз? Или използва по-малко памет? - person Jacktose   schedule 10.03.2018