(键,值)使用Python Lambdas进行配对

(键,值)使用Python Lambdas进行配对,python,python-3.x,apache-spark,Python,Python 3.x,Apache Spark,我正试图解决一个简单的字数计算问题,并试图找出是否可以通过使用map、filter和reduce来实现 以下是wordRDD(用于spark的列表)的示例: 我只需要数一数单词并以元组格式呈现: counts = [('cat', 1), ('elephant', 1), ('rat', 1), ('rat', 1), ('cat', 1)] 我尝试使用simple map()和lambdas作为: counts = myLst.map(lambdas x: (x, <HERE IS T

我正试图解决一个简单的字数计算问题,并试图找出是否可以通过使用map、filter和reduce来实现

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

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

counts = [('cat', 1), ('elephant', 1), ('rat', 1), ('rat', 1), ('cat', 1)]
我尝试使用simple map()和lambdas作为:

counts = myLst.map(lambdas x: (x, <HERE IS THE PROBLEM>))
counts=myLst.map(lambdas x:(x,))
我可能对语法有错误,或者可能感到困惑。 注意:这不是一个重复的问题,因为其余答案使用if/else或列表理解给出建议


谢谢你的帮助。

不用lambda,但可以完成任务

from collections import Counter
c = Counter(myLst)
result = list(c.items())
以及输出:

In [21]: result
Out[21]: [('cats', 3), ('rats', 2), ('elephants', 1)]
您根本不需要
map(..)
。只需
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)]
可以使用map()获得以下结果:

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

list(map(lambda x : (x,len(x)), myLst))

您是如何获得计数的?您的预期结果与您想要的内容和您的输入完全无关。
lambda
not
lambdas
@Hobbes,谢谢您的更正。。我是一个爪哇人,所以混合了它p为了清楚起见,如果您正在处理rdd,您可能应该先执行
map
,然后执行
reduceByKey
<代码>映射不是一个急切的操作。@zengr完全同意,我同意计数器确实有帮助。但不幸的是,在处理Spark库时,您处理的是RDD,而不是实际的列表。因此,集合中没有任何模块真正有助于获取k,v对。那么,在插入计数器之前,为什么不将它们转换为(k,v)元组呢?为什么要在列表中调用计数器两次?为什么不在计数器(myLst).items()中为x,y设置
?我正要这么说。在压缩两个对象之前,您依赖于两个对象的Counter.keys()和Counter.values()的基本顺序。这很容易导致问题。顺便说一句,计数器类上有
.items()
iteritems()
。我想你可以通过
result=list(c.items())
获得相同(但更短)的结果。问题是,我正在处理一个Spark项目,我们正在处理RDD而不是列表。因此,计数器对我们没有多大帮助。你知道你可以改进这个失败的回答尝试,不是吗?在这样做的同时,请添加对您将要展示的代码的解释,以及为什么它有帮助。即使您显示了工作代码,您的答案也将被视为仅代码无效。如果您简要解释您的代码,会有所帮助。。此外,您可能会注意到len(x)没有给出计数
    >>> 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)]
myLst = ['cats', 'elephants', 'rats', 'rats', 'cats', 'cats']

list(map(lambda x : (x,len(x)), myLst))