(键,值)对使用Python Lambdas

2024-10-03 13:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力解决一个简单的字数计算问题,并试图找出是否可以通过使用map,filter和reduce来完成。你知道吗

以下是wordRDD(用于spark的列表)的示例:

myLst = ['cats', 'elephants', 'rats', 'rats', 'cats', 'cats']

我只需要数一数单词并以元组格式呈现:

counts = [('cat', 1), ('elephant', 1), ('rat', 1), ('rat', 1), ('cat', 1)]

我尝试使用simple map()和lambdas作为:

counts = myLst.map(lambdas x: (x, <HERE IS THE PROBLEM>))

我可能是语法错误,或者可能是混淆了。 注意:这不是重复的问题,因为其余答案使用if/else或列表理解给出建议。你知道吗

谢谢你的帮助。你知道吗


Tags: 示例mapreduce列表filtercatsparkcats
3条回答

你根本不需要map(..)。你只要reduce(..)就可以做到

>>> def function(obj, x):
...     obj[x] += 1
...     return obj
...
>>> from functools import reduce
>>> reduce(function, myLst, defaultdict(int)).items()
dict_items([('elephants', 1), ('rats', 2), ('cats', 3)])

然后可以对结果进行迭代。你知道吗


但是,有一个更好的方法:查看^{}

不使用lambda但可以完成任务。你知道吗

from collections import Counter
c = Counter(myLst)
result = list(c.items())

以及输出:

In [21]: result
Out[21]: [('cats', 3), ('rats', 2), ('elephants', 1)]

如果您不想为自己完成完整的reduce步骤(它汇总了SuperSaiyan答案中的计数),可以这样使用map:

    >>> myLst = ['cats', 'elephants', 'rats', 'rats', 'cats', 'cats']
    >>> counts = list(map(lambda s: (s,1), myLst))
    >>> print(counts)
    [('cats', 1), ('elephants', 1), ('rats', 1), ('rats', 1), ('cats', 1), ('cats', 1)]

相关问题 更多 >