python - 从字典中过滤项目并处理子集

标签 python dictionary functional-programming

我有一个字典列表,我想选择与单独列表中的键相对应的项目(注意:我们可以假设每个 dict 都包含键)。此外,我想处理所选项目的子集

举个例子,给定:

keys_of_interest = ['a', 'b']
all_items =[ 
    {'a' : value_a1, 'b' : value_b1, 'c' : ...},
    {'a' : value_a2, 'b' : value_b2, 'c' : ...},
    ...
]

我要的结果是提取a对应的值得到的和 b并申请 fun只到 a ,即:

[
    [fun(value_a1), value_b1],
    [fun(value_a2), value_b2],
    ...
]   

key 提取部分可以通过以下方式完成:

from operator import itemgetter
[itemgetter(*keys_of_interest)(el) for el in all_items]

是否有任何(优雅的)方法将 itemgetter 与函数结合起来

最佳答案

如果优先考虑优雅,您可以先转换字典,然后使用 itemgetter 而无需进一步调整。为此,您需要将要应用函数的键与只需要原始值的键分开——我认为这在任何情况下都是一件好事。

首先,设置

keys_of_interest = ['a', 'b', 'c', 'd']
keys_for_func = ['a', 'b']  # with this approach you can apply a func to multiple keys

func = lambda x: x ** 2  # for demo
all_dicts = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5},
             {'a': 6, 'b': 7, 'c': 8, 'd': 9, 'e': 10}]

然后这就是我要做的:

transformed = ({k: func(v) if k in keys_for_func else v for k, v in d.items()}
               for d in all_dicts)
result = list(map(itemgetter(*keys_of_interest), transformed))

结果:

[(1, 4, 3, 4), (36, 49, 8, 9)]

关于python - 从字典中过滤项目并处理子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352946/

相关文章:

dictionary - 为什么 Map 不适用于 Groovy 中的 GString?

java - 我可以按元素的类过滤 Stream<T> 并一步获得 Stream<U> 吗?

haskell - Swift 中的函数式思维?

python __repr__

python - 在没有登录的情况下使用 ssh-agent

python - (Python/C API) "ModuleNotFoundError"用于子目录中的模块

javascript - 当我已经声明属性时,无法读取未定义的 ReactJS 的属性 'map'

java - 从 Map 的键/值 subview 中删除元素?

python - 用于在 Python 中过滤对象的用户界面

recursion - SML 中的递归匿名函数