簡體   English   中英

將列表推導轉換為函數式編程

[英]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)}]

對於每個字典中的每個鍵,我只想保留值的第一個元素。 所以所需的 output 是

[{'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 等獲得相同的 output。到目前為止我所擁有的:

map(dict.values, lst)

但我不知道如何從這里 go 。

對於嵌套迭代,我認為沒有 lambda 表達式的幫助我們無法做到:

from operator import itemgetter, methodcaller

list(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}]

我不得不說它非常丑陋。

更新:我找到了避免 lambda 的方法:

  1. 首先,根據評論區,我們對上面的表達式進行簡化(為了降低理解難度,這里省略了最外層的列表):
func = lambda d: dict(zip(d, map(itemgetter(0), d.values())))
map(func, lst)
  1. 很容易觀察到dict可以移到lambda之外。 我們只需要添加另一個map
func = lambda d: zip(d, map(itemgetter(0), d.values()))
map(dict, map(func, lst))
  1. 同樣,我們可以將 zip 移到zip之外:
func = lambda d: map(itemgetter(0), d.values())
map(dict, map(zip, lst, map(func, lst)))
  1. 好像到此為止了,好像沒有辦法把lambda轉換成多個內置函數的組合,不過還是有辦法的,我們先試試把d.values移到d.values之外。 這里,由於列表的元素類型已經確定,我們直接使用dict.values代替operator.methodcaller
func = lambda values: map(itemgetter(0), values)
map(dict, map(zip, lst, map(func, map(dict.values, lst))))
  1. 答案已經准備好了。 我們可以使用functools.partial消除 lambda :
map(dict, map(zip, lst, map(partial(map, itemgetter(0)), map(dict.values, lst))))

測試:

>>> from operator import itemgetter
>>> from functools import partial
>>> lst = [{'a': (1, 2, 3), 'b': (2, 3)},
...        {'c': (3, 6), 'd': (4, 8), 'e': (5, 10)},
...        {'d': (6, 12), 'e': (7, 14)}]
>>> map(dict, map(zip, lst, map(partial(map, itemgetter(0)), map(dict.values, lst))))
<map object at 0x000002A0542CBB20>
>>> list(_)
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4, 'e': 5}, {'d': 6, 'e': 7}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM