【发布时间】:2017-04-17 16:01:23
【问题描述】:
我正在尝试将itertools.groupby 的结果解码为值列表。
我的来源是:
x = [(1, 2), (2, 1), (6, 3), (6, 5), (1, 3)]
虽然最初的方法是使用这样的 for 语句来实现:
keyfunc = itemgetter(0)
groups = []
uniquekeys = []
data = sorted(x, key=keyfunc)
for k, g in itertools.groupby(data, keyfunc):
groups.append(list(g)) # Store group iterator as a list
uniquekeys.append(k)
我选择使用列表推导将其放在一行中:
[(k, list(g)) for k, g in list(itertools.groupby(x, keyfunc))]
第一种方法的结果是:
[1, 2, 6] #for uniquekeys
[[(1, 2), (1, 3)], [(2, 1)], [(6, 3), (6, 5)]] #for groups
这完全有道理。
第二种方法的结果是:
[(1, []), (2, []), (6, [(6, 5)])]
我们可以看到这些组要么是空的,要么是单个整数。
哪里出错了?
【问题讨论】:
-
只要使用
[(k, list(g)) for k, g in itertools.groupby(x, keyfunc)] -
@ThierryLathuille 为什么会有所作为?
-
我会尽快写解释的……
-
这是因为您在
groupby迭代器上调用list,这会耗尽它。调用 list 然后iterator和 then 迭代它会破坏整个目的......你为什么认为它是必要的? -
文档中其实有提到:"返回的组本身就是一个迭代器,它和groupby()共享底层的iterable。因为源是共享的,所以当groupby()对象被推进,之前的组不再可见。”
标签: python group-by list-comprehension itertools