为了账号安全,请及时绑定邮箱和手机立即绑定

与 defaultdict 结合使用时计数器排序丢失

与 defaultdict 结合使用时计数器排序丢失

蝴蝶不菲 2021-07-13 15:14:33
我正在尝试获取由(item_number, fruit)元组组成的列表,并计算每种水果出现在列表中的次数。使用collections.Counter. 我正在使用most_common()它。我遇到的问题是,当试图同时显示与特定类型水果相对应的 item_numbers 列表时,它们会变得乱七八糟。这是我的示例代码:#!/usr/bin/env pythonfrom collections import Counter, defaultdictmylist = [            (1, 'peach'),            (2, 'apple'),            (3, 'orange'),            (4, 'apple'),            (5, 'banana'),            (6, 'apple'),            (7, 'orange'),            (8, 'peach'),            (9, 'apple'),            (10, 'orange'),            (11, 'plum'),            ]# FIRST, HANDLE JUST COUNTING THE ITEMSnormal_list = []# append to a simple listfor item_number, fruit in mylist:    normal_list.append(fruit)# prints just the name of each fruit and how many times it appearsfor fruit, count in Counter(normal_list).most_common(10):    print(f'{fruit}\tCount: {count}')  # NOW TRY TO INCLUDE THE LIST IF ITEM NUMBERS ALSOmydefaultdict = defaultdict(list)# append to the defaultdictfor item_number, fruit in mylist:    mydefaultdict[fruit].append(item_number)# prints each fruit, followed by count, and finally the list of IPs for eachfor fruit, item_list in Counter(mydefaultdict).most_common(10):    print(f'{fruit}\tCount: {len(item_list)}\tList: {item_list}')我得到了更简单版本的预期输出:apple   Count: 4orange  Count: 3peach   Count: 2banana  Count: 1plum    Count: 1但是,当我尝试向其中添加 item_number 列表时,结果不再排序,当我使用most_common()小于水果品种总数的值时,这会造成严重破坏:plum    Count: 1    List: [11]banana  Count: 1    List: [5]orange  Count: 3    List: [3, 7, 10]apple   Count: 4    List: [2, 4, 6, 9]peach   Count: 2    List: [1, 8]我确信在这里我可以做一些不同的事情,但我不太确定是什么。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

Counter(mydefaultdict)不是在做你认为它在做的事情。您正在将 a defaultdictof列表提供给Counter,其目的是计算出现次数,而不是计算列表的长度。事实上,价值你的Counter目标只是表,不是整数。Counter不会抱怨,因为它是dictand like的子类,dict可以用另一个字典初始化。


要按最长列表排序,您可以使用heapq.nlargest自定义函数:


from heapq import nlargest


for fruit, item_list in nlargest(10, mydefaultdict.items(), key=lambda x: len(x[1])):

    print(f'{fruit}\tCount: {len(item_list)}\tList: {item_list}')


apple   Count: 4    List: [2, 4, 6, 9]

orange  Count: 3    List: [3, 7, 10]

peach   Count: 2    List: [1, 8]

banana  Count: 1    List: [5]

plum    Count: 1    List: [11]


查看完整回答
反对 回复 2021-07-28
?
手掌心

TA贡献1942条经验 获得超3个赞

这部分很难:


Counter(mydefaultdict)

您的对象mydefaultdict已经填充了列表作为值,但Counter对象通常使用正整数作为值。这实际上不是错误,因为它Counter是一个 dict 子类,所以它会接受任何 dict 作为初始化参数。除了有一个问题:most_common不再返回正常的结果(如果你很好奇,它实际上是根据列表放置字典顺序)。


也许更清楚的是这样的:


most_common_fruits = sorted(mydefaultdict, key=lambda f: len(mydefaultdict[f]), reverse=True)

for fruit in most_common_fruits:

    item_list = mydefaultdict[fruit]

    ...

现在输出是这样的:


apple   Count: 4    List: [2, 4, 6, 9]

orange  Count: 3    List: [3, 7, 10]

peach   Count: 2    List: [1, 8]

banana  Count: 1    List: [5]

plum    Count: 1    List: [11]


查看完整回答
反对 回复 2021-07-28
  • 2 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信