Python: функция, которая принимает повторяющийся аргумент и генерирует кортежи

Я пытаюсь что-то сделать на питоне.

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

  1. текущий итерируемый элемент
  2. количество раз, когда он был сгенерирован с самого начала

Вот мой код

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"

Спасибо за помощь

У вас не может быть словаря с одинаковыми ключами. Может быть, список - это то, что вы ищете? Похоже, что порядок важен в результате.

kabanus 13.07.2018 22:33

Также обратите внимание, что вызов fromkeys на пример dict создает этот экземпляр бессмысленно; это метод класса.

jonrsharpe 13.07.2018 22:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
1 354
5

Ответы 5

Ваш ожидаемый результат - это список, а не словарь. Исправить ваш код было бы, используя ваш 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)]

Другие вопросы по теме