我在 reducer 输出中得到一个列表列表,而不是成对的值,我不确定在我的代码中要更改啥
Posted
技术标签:
【中文标题】我在 reducer 输出中得到一个列表列表,而不是成对的值,我不确定在我的代码中要更改啥【英文标题】:I'm getting a list of lists in my reducer output rather than a paired value and I am unsure of what to change in my code我在 reducer 输出中得到一个列表列表,而不是成对的值,我不确定在我的代码中要更改什么 【发布时间】:2021-12-28 00:32:41 【问题描述】:下面的代码给了我几乎我想要但不完全的输出。
def reducer(self, year, words):
x = Counter(words)
most_common = x.most_common(3)
sorted(x, key=x.get, reverse=True)
yield (year, most_common)
这是给我输出
"2020" [["coronavirus",4],["economy",2],["china",2]]
我希望它给我的是
"2020" "coronavirus china economy"
如果有人可以向我解释为什么我得到一个列表而不是我需要的输出,我将不胜感激。以及如何改进代码以获得我需要的想法。
【问题讨论】:
你能告诉我们reducer()
的函数调用以及你传递给函数的参数吗?
您正在对x
的副本进行排序,这不会影响most_common
,这是您从函数中返回的内容。我是否正确假设您想按照频率从最高到最低对单词进行排序,并且如果有任何单词与频率相关,则按字母顺序对它们进行排序?
@Reti43 是的,这是正确的。按照从高到低(前 3 个单词)然后按字母顺序对单词进行排序。
@Reti43 我之前没有使用过 Counter 功能,所以我不确定它是如何工作的。我应该对什么进行排序?谢谢。
【参考方案1】:
Counter.most_common
的文档解释了为什么你会得到一个列表。
most_common(n=None) method of collections.Counter instance
List the n most common elements and their counts from the most
common to the least. If n is None, then list all element counts.
>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
因为从最高频率到最低频率排序就像按降序排序,但按字母顺序排序是升序,您可以使用自定义元组,在其中取频率的负数并按升序对所有内容进行排序。
from collections import Counter
words = Counter(['coronavirus'] * 4 + ['economy'] * 2 + ['china'] * 2 + ['whatever'])
x = Counter(words)
most_common = x.most_common(3)
# After sorting you need to discard the freqency from each (word, freq) tuple
result = ' '.join(word for word, _ in sorted(most_common, key=lambda x: (-x[1], x[0])))
【讨论】:
感谢您的明确回答 - 这非常有帮助。以上是关于我在 reducer 输出中得到一个列表列表,而不是成对的值,我不确定在我的代码中要更改啥的主要内容,如果未能解决你的问题,请参考以下文章
map,reduce,filter的总结(reduce还有点不懂,一会自己再看看)
如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别