首页 > 解决方案 > 如何用字典计算元组元组中的所有元素?

问题描述

我有以下列表:

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

标签: pythondictionarytuples

解决方案


对于任意深度的元组,您可以使用递归函数进行展平:

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}

推荐阅读