Python在不破坏i的情况下使用generator

2024-09-30 20:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个生成器对象。 我想数一数每个元素有多少。不破坏发电机/更换(我想以后再使用)。你知道吗

下面是一个例子。你知道吗

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]

Tags: 对象inadd元素forifdefcreate
2条回答

除非我从根本上误解了Python生成器的工作方式,否则这是不可能的,您应该返回create方法,而不是生成一个生成器。你知道吗

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

上面的列表理解将创建一个列表,而不是使用生成器。为了更好地理解生成器,我建议通读this excellent post。你知道吗

编辑:出于好奇,我对Tomothy32建议的list(create(n))方法进行了计时,该方法返回一个list。正如预期的那样,返回生成器然后通过理解存储列表要慢一些(平均130微秒对125微秒)。但是,您可能更喜欢保持原始方法不变,并且可以使用简单的选项将特定的生成器调用保存为列表,而不是重新定义它并始终返回列表对象。你知道吗

无需更改create生成器。只要做:

gen_list = list(create(100))

你想用多少就用多少。你知道吗

相关问题 更多 >