Для произвольных кортежей глубины вы можете использовать рекурсивную функцию для выравнивания:
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}