将列表理解转换为函数式编程
Convert a list comprehension to functional programming
我有一个词典列表
lst = [{'a': (1, 2, 3), 'b': (2, 3)},
{'c': (3, 6), 'd': (4, 8), 'e': (5, 10)},
{'d': (6, 12), 'e': (7, 14)}]
对于每个字典中的每个键,我只想保留值的第一个元素。所以期望的输出是
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}, {'d': 6, 'e': 7}]
我可以使用像
这样的列表理解来得到它
[{key: val[0] for key, val in dct.items()} for dct in lst]
但是,我想知道是否可以使用 map、itemgetter、itertools、functools 等获得相同的输出。我目前拥有的是:
map(dict.values, lst)
但我不知道如何从这里开始。
对于嵌套迭代,我认为如果没有 lambda 表达式的帮助我们是做不到的:
from operator import itemgetter, methodcaller
[*map(
lambda items: dict(zip(
map(itemgetter(0), items),
map(itemgetter(0), map(itemgetter(1), items))
)), map(methodcaller('items'), lst))]
# [{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}, {'d': 6, 'e': 7}]
不得不说很丑
我有一个词典列表
lst = [{'a': (1, 2, 3), 'b': (2, 3)},
{'c': (3, 6), 'd': (4, 8), 'e': (5, 10)},
{'d': (6, 12), 'e': (7, 14)}]
对于每个字典中的每个键,我只想保留值的第一个元素。所以期望的输出是
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}, {'d': 6, 'e': 7}]
我可以使用像
这样的列表理解来得到它[{key: val[0] for key, val in dct.items()} for dct in lst]
但是,我想知道是否可以使用 map、itemgetter、itertools、functools 等获得相同的输出。我目前拥有的是:
map(dict.values, lst)
但我不知道如何从这里开始。
对于嵌套迭代,我认为如果没有 lambda 表达式的帮助我们是做不到的:
from operator import itemgetter, methodcaller
[*map(
lambda items: dict(zip(
map(itemgetter(0), items),
map(itemgetter(0), map(itemgetter(1), items))
)), map(methodcaller('items'), lst))]
# [{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}, {'d': 6, 'e': 7}]
不得不说很丑