Я пытаюсь что-то сделать на питоне.
Я пытаюсь написать функцию, которая принимает итеративный аргумент и генерирует кортежи из двух элементов:
Вот мой код
liste = ['a','b','a','a','b']
compte = {}.fromkeys(set(liste),0)
for valeur in liste:
compte[valeur] += 1
print(compte)
выход :
{'b': 2, 'a': 3}
Но я хочу получить "a:1" "b:1" "a:2" "a:3" and "b:2"
Спасибо за помощь
Также обратите внимание, что вызов fromkeys на пример dict создает этот экземпляр бессмысленно; это метод класса.






Ваш ожидаемый результат - это список, а не словарь. Исправить ваш код было бы, используя ваш dict для подсчета, но добавляя его в список:
>>> liste = ['a','b','a','a','b']
>>>
>>> compte = dict.fromkeys(liste,0) #Or use a default dict
>>> result = []
>>> for valeur in liste:
... compte[valeur] += 1
... result.append((valeur,compte[valeur]))
...
>>> print(result)
[('a', 1), ('b', 1), ('a', 2), ('a', 3), ('b', 2)]
Используйте функцию генератора.
from collections import defaultdict
def with_running_count(values):
counts = defaultdict(int)
for value in values:
counts[value] += 1
yield value, counts[value]
>>> print(*with_running_count('abaab'))
('a', 1) ('b', 1) ('a', 2) ('a', 3) ('b', 2)
Одно из преимуществ использования генератора по сравнению с другими предложениями состоит в том, что генераторы ленивы. Это означает, что вы можете передавать итераторы, которые возвращают бесконечный (или очень большой) поток данных, поскольку генератор потребляет входной поток только тогда, когда это необходимо.
# an endless iterator
coin = iter(lambda: random.choice(['heads', 'tails']), None)
# the running count will also be endless
toss = with_running_count(coin)
>>> next(toss), next(toss), next(toss)
(('tails', 1), ('tails', 2), ('heads', 1))
Вы можете просто изменить свой код таким образом:
liste = ['a','b','a','a','b']
liste2 = []
compte = {}.fromkeys(set(liste),0)
for valeur in liste:
compte[valeur] += 1
liste2.append(valeur + ':' + str(compte[valeur]))
print(liste2)
Важно сказать: то, что вы пытаетесь сделать, это не кортеж, а список, потому что он изменяемый. Ваша переменная compte - это dictionary.
Вы можете инициализировать словарь счетчиками по ходу:
liste = ['a','b','a','a','b']
compte = {}
result = []
for valeur in liste:
compte[valeur] = compte.get(valeur, 0) + 1
result.append((valeur, compte[valeur]))
print(result)
Вы можете использовать Counter из модуля collections:
from collections import Counter
liste = ['a','b','a','a','b']
def counter(iterable):
c = Counter()
for i in iterable:
c.update(i)
yield i, c[i]
print(list(counter(liste)))
Выходы:
[('a', 1), ('b', 1), ('a', 2), ('a', 3), ('b', 2)]
У вас не может быть словаря с одинаковыми ключами. Может быть, список - это то, что вы ищете? Похоже, что порядок важен в результате.