Python использует генератор, не разрушая его - PullRequest
0 голосов
/ 23 января 2019

Привет, у меня есть объект генератора. Я хочу посчитать, сколько в нем каждого элемента. Без разрушения генератора / замены (я хочу использовать его позже).

Вот пример.

def create(n):
    items = ["a", "b", "c"]
    for i in range(n):
        yield items[random.randint(0,2)]

def countEach(gen):
    r = []
    for a in gen:
        add = True
        for i in range(len(r)):
            if a == r[i][0]:
                r[i][1] += 1
                add = False
        if add:
            r.append([a,0])
    return r

gen_list = create(100)
print (countEach(gen_list))
for b in gen_list:
    print (b)

выход

[['b', 33345], ['c', 33298], ['a', 33354]]
[Finished in 0.6s]

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Нет необходимости менять генератор create. Просто сделай:

gen_list = list(create(100))

Вы можете использовать это столько раз, сколько хотите.

0 голосов
/ 23 января 2019

Если я в корне не понимаю, как работают генераторы Python, это невозможно, и вы должны вернуться в своем методе создания вместо генератора.

def create(n):
    items = ["a", "b", "c"]
    return [items[random.randint(0,2)] for i in range(n)]

Приведенное выше понимание списка скорее создаст списокчем использовать генератор.Для лучшего понимания генераторов я бы предложил прочитать этот превосходный пост .

РЕДАКТИРОВАТЬ: Из любопытства я рассчитал метод списка (create (n)), предложенный Tomothy32, против моего, которыйвозвращает список.Как и ожидалось, чуть медленнее вернуть генератор, а затем сохранить список с помощью понимания (в среднем 130 микросекунд против 125 микросекунд).Однако вы можете предпочесть оставить исходный метод без изменений и иметь простую возможность сохранять определенные вызовы генератора в виде списков, а не переопределять его и всегда возвращать объект списка.

...