【问题标题】:(key, value) pair using Python Lambdas使用 Python Lambdas 的 (key, value) 对
【发布时间】:2020-04-20 14:26:36
【问题描述】:

我正在尝试解决一个简单的字数统计问题,并试图弄清楚这是否可以通过使用 map、filter 和 reduce 来完成。

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

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

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

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

我尝试使用简单的 map() 和 lambdas 作为:

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

我的语法可能有误或混淆了。 P.S.:这不是重复的问题,因为其余答案使用 if/else 或列表推导给出建议。

感谢您的帮助。

【问题讨论】:

  • 你是怎么得到counts的?您的预期结果与您想要的输入完全无关。
  • lambda 不是lambdas
  • @Hobbes,感谢您的指正.. 我是一个 java 人,所以混合它! :P
  • 明确一点,如果您正在处理 rdd,您可能应该先使用map,然后再使用reduceByKeymap 不是一个急切的操作。
  • @zengr 完全同意

标签: python python-3.x apache-spark


【解决方案1】:

你根本不需要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)])

然后您可以迭代结果。


但是,有更好的方法:查看Counter

【讨论】:

  • 问题是,我正在处理一个 Spark 项目,我们正在处理 RDD 而不是列表。因此,计数器对我们没有多大帮助。
【解决方案2】:

不使用 lambda,但可以完成工作。

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

还有输出:

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

【讨论】:

  • 我同意 Counter 确实有帮助。但不幸的是,在处理 Spark 库时,您处理的是 RDD,而不是实际列表。因此,集合中没有任何模块真正有助于获得 k,v 对。
  • 为什么不在插入计数器之前将它们转换为 (k, v) 元组?
  • 你为什么要在列表中调用 Counter 两次?为什么不for x,y in Counter(myLst).items()
  • 我正要这么说。在压缩它们之前,您依赖于两个对象之间的 Counter.keys() 和 Counter.values() 的基本顺序。这很容易导致问题。顺便说一句,Counter 类上有.items()iteritems()
  • 我猜你可以使用result = list(c.items())获得相同(但更短)的结果
【解决方案3】:

如果您不希望为您完成完整的 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)]

【讨论】:

    【解决方案4】:

    你可以使用 map() 来得到这个结果:

    myLst = ['cats', 'elephants', 'rats', 'rats', 'cats', 'cats']
    
    list(map(lambda x : (x,len(x)), myLst))
    

    【讨论】:

    • 你知道你可以edit 来改善这个失败的回答尝试,不是吗?在这样做的同时,请添加对您将展示的代码的解释以及它为什么有帮助。即使您显示工作代码,否则您的答案将被视为无用的代码。
    • 如果你简要解释一下你的代码会有所帮助..你可能会注意到 len(x) 没有给出计数
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 2017-02-01
    • 2013-06-24
    • 2013-03-31
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多