• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

如何优雅地对数据进行分组

python 搞java代码 3年前 (2022-07-26) 67次浏览 已收录 0个评论

假如咱们有这样一种数据:

data = [
    ("apple", 30), ("apple", 35),
    ("apple", 32), ("pear", 60),
    ("pear", 32), ("pear", 60),
    ("banana", 102), ("banana", 104)
]

# 咱们心愿变成如下格局
"""
[('apple', [30, 35, 32]), 
 ('pear', [60, 32, 60]), 
 ('banana', [102, 104])]
"""

如果是你的话,你会怎么做呢?很容易想到的一种解决方案是结构一个字典:

data = [
    ("apple", 30), ("apple", 35),
    ("apple", 32), ("pear", 60),
    ("pear", 32), ("pear", 60),
    ("banana", 102), ("banana", 104)
]

data_dict = {}
for name, count in data:
    if name not in data_dict:
        data_dict[name] = []
    data_dict[name].append(count)
print(data_dict)
"""
{'apple': [30, 35, 32], 
 'pear': [60, 32, 60], 
 'banana': [102, 104]}
"""
print(list(data_dict.items()))
"""
[('apple', [30, 35, 32]), 
 ('pear', [60, 32, 60]), 
 ('banana', [102, 104])]
"""

这种计划齐全没有问题,不过咱们还能够写的更优雅一些,也就是应用字典的 setdefault 办法:

data = [
    ("apple", 30), ("apple", 35),
    ("apple", 32), ("pear", 60),
    ("pear", 32), ("pear", 60),
    ("banana", 102), ("banana", 104)
]

data_dict = {}
for name, count in data:
    # setdefault(k, v) 含意如下
    # 当 k 不存在时,将 k: v 设置在字典中,并返回 v
    # 当 k 存在时,间接返回 k 对应值
    data_dict.setdefault(name, []).append(count)

print(list(data_dict.items()))
"""
[('apple', [30, 35, 32]), 
 ('pear', [60, 32, 60]), 
 ('banana', [102, 104])]
"""

setdefault 是一个十分不便的办法,然而应用频率却不怎么高,或者说该办法不太让人喜爱。次要是每次调用都要给一个初始值,比方代码中的空列表 []。另外这里的初始值能够任意,如果你心愿增加的时候还能实现去重成果,那么就将空列表换成空集合即可。

或者咱们还能够应用 defaultdict,它位于 collections 模块中。

from collections import defaultdict

data = [
    ("apple", 30), ("apple", 35),
    ("apple", 32), ("pear", 60),
    ("pear", 32), ("pear", 60),
    ("banana", 102), ("banana", 104)
]

# 外面接管一个 callable
# 当拜访的 k 不存在时,返回 callable 调用之后的值
data_dict1 = defaultdict(list)
for name, count in data:
    data_dict1[name].append(count)

print(list(data_dict1.items()))
"""
[('apple', [30, 35, 32]), 
 ('pear', [60, 32, 60]), 
 ('banana', [102, 104])]
"""

# 也能够指定为 set
data_dict2 = defaultdict(set)
for name, count in data:
    data_dict2[name].add(count)

print(list(data_dict2.items()))
"""
[('apple', {32, 35, 30}), 
 ('pear', {32, 60}), 
 ('banana', {104, 102})]
"""

总的来说,defaultdict 和字典的 setdefault 办法十分相似,咱们应用 setdefault 即可。

当然啦,对于分组,还有一种非凡状况,就是词频统计。假如咱们想统计可迭代对象中,每个元素呈现的次数该怎么做呢?

data = ["apple", "apple", "apple",
        "pear", "pear", "pear",
        "banana", "banana"]

data_dict = {}
for item in data:
    # 此处不能应用 setdefault,因为它是函数
    # .setdefault(item, 0) += 1 是不合乎语法规定的
    if item not in data_dict:
        data_dict[item] = 0
    data_dict[item] += 1

print(data_dict)
"""
{'apple': 3, 'pear': 3, 'banana': 2}
"""

# 或者应用 defaultdict
from collections import defaultdict
data_dict = defaultdict(int)
for item in data:
    data_dict[item] += 1
print(data_dict)
"""
defaultdict(<class 'int'>, 
            {'apple': 3, 'pear': 3, 'banana': 2})
"""

然而说到词频统计,咱们还能够应用 collections 下的 Counter 类。

from collections import Counter

data = ["apple", "apple", "apple",
        "pear", "pear", "pear",
        "banana", "banana"]

data_dict = Counter(data)
# 间接搞定,Counter 曾经蕴含了咱们之前的逻辑
print(data_dict)
"""
Counter({'apple': 3, 'pear': 3, 'banana': 2})
"""
# Counter 继承 dict,除了反对字典操作之外
# 还提供了很多其它操作,其中一个就是 most_common
# 用于抉择呈现频率最高的几个元素
print(data_dict.most_common(2))
"""
[('apple', 3), ('pear', 3)]
"""

还是很简略的。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何优雅地对数据进行分组

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址