嗨,我有一个生成器对象。 我想计算其中每个元素有多少个。无需破坏发生器/更换(我想稍后再使用)。
这里是一个例子。
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]
答案 0 :(得分:1)
除非我从根本上对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))方法进行了计时,该方法返回了一个列表。不出所料,返回生成器然后通过理解存储列表要慢得多(平均130微秒与125微秒)。但是,您可能希望保留原始方法不变,并具有将特定生成器调用保存为列表的简单选项,而不是重新定义它并始终返回列表对象。
答案 1 :(得分:0)
无需更改create
生成器。只要做:
gen_list = list(create(100))
您可以随意重复使用它。