在python中用字典来实现映射_映射python字典中的值

这篇博客讨论了在Python中如何使用字典理解或其他方法来映射字典中的值,如通过函数f对每个值进行变换。提到了几种不同的实现方式,包括直接使用字典推导式、使用map()函数、使用工具库如toolz的valmap(),以及创建自定义的字典子类来实现递归映射。文章提供了多种解决方案,适用于不同的需求场景。
摘要由CSDN通过智能技术生成

映射python字典中的值

鉴于字典{ 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)

也就是说,如果原始字典被改变或创建了副本,对我来说无关紧要。

6个解决方案

251 votes

没有这样的功能; 最简单的方法是使用字典理解:

my_dictionary = {k: f(v) for k, v in my_dictionary.items()}

在python 2.7中,使用map()方法代替.items()来节省内存。 直到python 2.7才引入dict理解语法。

请注意,列表上也没有这样的方法; 你必须使用列表理解或map()功能。

因此,您也可以使用map()函数来处理您的dict:

my_dictionary = dict(map(lambda kv: (kv[0], f(kv[1])), my_dictionary.iteritems()))

但那不是那么可读,真的。

Martijn Pieters answered 2019-04-09T01:26:42Z

20 votes

这些工具非常适合这种简单而重复的逻辑。

[http://toolz.readthedocs.org/en/latest/api.html#toolz.dicttoolz.valmap]

得到你想要的地方。

import toolz

def f(x):

return x+1

toolz.valmap(f, my_list)

Jesse Smith answered 2019-04-09T01:27:27Z

18 votes

您可以就地执行此操作,而不是创建新的dict,这可能适用于大型词典(如果您不需要副本)。

def mutate_dict(f,d):

for k, v in d.iteritems():

d[k] = f(v)

my_dictionary = {'a':1, 'b':2}

mutate_dict(lambda x: x+1, my_dictionary)

结果my_dictionary包含:

{'a': 2, 'b': 3}

gens answered 2019-04-09T01:28:09Z

4 votes

虽然我的原始答案忽略了这一点(试图通过在defaultdict工厂中访问密钥的解决方案来解决这个问题),但我已经重新设计了它以提出对当前问题的实际解决方案。

这里是:

class walkableDict(dict):

def walk(self, callback):

try:

for key in self:

self[key] = callback(self[key])

except TypeError:

return False

return True

用法:

>>> d = walkableDict({ k1: v1, k2: v2 ... })

>>> d.walk(f)

我们的想法是将原始dict子类化,以赋予其所需的功能:在所有值上“映射”一个函数。

加分是这个字典可以用来存储原始数据,好像它是try,同时使用回调转换请求的任何数据。

当然,您可以随意按照您想要的方式命名类和函数(在此答案中选择的名称受PHP的try函数启发)。

注意:try-except块和return语句都不是必需的功能,它们可以进一步模仿PHP array_walk的行为。

7heo.tk answered 2019-04-09T01:29:12Z

2 votes

由于PEP-0469将iteritems()重命名为items()和PEP-3113,它们删除了Tuple参数解包,因此在Python 3.x中你应该编写Martijn Pieters♦这样的答案:

my_dictionary = dict(map(lambda item: (item[0], f(item[1]), my_dictionary.items()))

lucidyan answered 2019-04-09T01:29:40Z

0 votes

刚刚遇到这个用例。 我实现了基因回答,添加了一个递归方法来处理值也是如此:

def mutate_dict_in_place(f, d):

for k, v in d.iteritems():

if isinstance(v, dict):

mutate_dict_in_place(f, v)

else:

d[k] = f(v)

# Exemple handy usage

def utf8_everywhere(d):

mutate_dict_in_place((

lambda value:

value.decode('utf-8')

if isinstance(value, bytes)

else value

),

d

)

my_dict = {'a': b'byte1', 'b': {'c': b'byte2', 'd': b'byte3'}}

utf8_everywhere(my_dict)

print(my_dict)

在处理在Python 2中将字符串编码为字节的json或yaml文件时,这非常有用

Oyono answered 2019-04-09T01:30:15Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值