python - 如何用字典计算元组元组中的所有元素?
问题描述
我有以下列表:
lst= (1,(1,2), 3, (3,4), 1, 3)
我想使用字典函数生成输出,该输出将计算每个值出现的次数,使其看起来像这样:
{1:3, 2:1, 3:3, 4:1}
我不知道如何做到这一点。谢谢!
以下是我的尝试:
def f(*args):
for x in args:
d = {x:args.count(x) for x in args}
return d
解决方案
对于任意深度的元组,您可以使用递归函数进行展平:
def flatten_nested_tuples(tuples):
for tup in tuples:
if isinstance(tup, tuple):
yield from flatten_nested_tuples(tup)
else:
yield tup
语法yield from x
等同于. for item in x: yield item
它只是创建生成器的一种更短的方法。您可以查看此答案和此答案以获取有关生成器和yield
关键字的更多信息。
要计数,我们可以使用collections.Counter
扁平元组来计数:
from collections import Counter
lst= (1,(1,2), 3, (3,4), 1, 3)
print(Counter(flatten_nested_tuples(lst)))
输出:
Counter({1: 3, 3: 3, 2: 1, 4: 1})
注意: Counter
是 的子类dict
,因此您可以将其视为常规字典。
如果您想在没有任何模块的情况下计算自己,则必须自己进行0
初始化:
counts = {}
for item in flatten_nested_tuples(lst):
counts[item] = counts.get(item, 0) + 1
print(counts)
# {1: 3, 2: 1, 3: 3, 4: 1}
或不使用dict.get()
:
counts = {}
for item in flatten_nested_tuples(lst):
if item not in counts:
counts[item] = 0
counts[item] += 1
print(counts)
# {1: 3, 2: 1, 3: 3, 4: 1}
推荐阅读
- haskell - 为什么 Haskell 不允许更复杂的中缀表达式?
- javascript - setInterval() 不适用于制作数字时钟
- machine-learning - 对非语言概念使用嵌入?
- android - 将意图从活动发送到片段
- javascript - 不确定我是否有语法错误或代码错误
- java - 渲染 TIFF 文件时的 AWT-EventQueue-0
- python-3.x - 有没有办法使用 mlfow 从 AWS Glue 作业记录统计信息/工件?
- javascript - UnhandledPromiseRejectionWarning:错误:无法处理 ISO 14443-4 标记,因为未设置 AID
- ios - 如何从 captureOutput (didDrop samplebuffer) 中提取图像缓冲区?
- c++ - 如何使用转发将右值转换为左值引用?