Как посчитать все элементы в кортеже кортежей со словарем? - PullRequest
1 голос
/ 08 апреля 2020

У меня есть следующий список:

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

1 Ответ

1 голос
/ 08 апреля 2020

Для произвольных кортежей глубины вы можете использовать рекурсивную функцию для выравнивания:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...