如果我取消注释for循环中的print()函数,'groups'列表将填充空列表而不是结果

Vin*_*nny 2 python for-loop python-itertools python-3.x

import itertools

data1 =[100,80,80,80,80,80,90,90,85,85,85]
keys = []
groups = []
sorted_data1 = sorted(data1)

for k,g in itertools.groupby(sorted_data1):
    #print('key: ',k,' group: ',list(g))
    keys.append(k)
    groups.append(list(g))

print('keys: ', keys)
print('Groups: ', groups)
Run Code Online (Sandbox Code Playgroud)

上述代码的结果:

keys:  [80, 85, 90, 100]
Groups:  [[80, 80, 80, 80, 80], [85, 85, 85], [90, 90], [100]]

RESULT I GET WHEN 'print()' IS UNCOMMENTED:
key:  80  group:  [80, 80, 80, 80, 80]
key:  85  group:  [85, 85, 85]
key:  90  group:  [90, 90]
key:  100  group:  [100]
keys:  [80, 85, 90, 100]
Groups:  [[], [], [], []]
Run Code Online (Sandbox Code Playgroud)

在for循环中取消注释print()会将'groups'作为空列表的列表.请仔细研究一下.

Den*_*ers 5

在循环

for k,g in itertools.groupby(sorted_data1):
Run Code Online (Sandbox Code Playgroud)

g 它本身就是一个迭代器,它不是一个像列表一样的集合.

你打电话的时候

print('key: ',k,' group: ',list(g))
Run Code Online (Sandbox Code Playgroud)

在循环list(g)内部,print内部已经遍历整个迭代器g以创建列表.所以,当你打电话的时候

groups.append(list(g))
Run Code Online (Sandbox Code Playgroud)

之后,g在某种意义上已经是"空的"(更确切地说:它指向迭代器的末尾),所以没有什么可以放在列表中了


与DDGG建议的一样,您可以先将g更多永久性集合(如a list)中的迭代结果存储起来.然后,您可以多次重复使用该列表