Python列表理解不适用于itertools.groupby解码

时间:2017-04-17 16:01:23

标签: python group-by list-comprehension itertools

我正在尝试将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)])]

我们可以看到这些组是空的或者是单个整数。

哪里出错?

1 个答案:

答案 0 :(得分:1)

问题是list(itertools.groupby(x, keyfunc))中的列表。放下它就可以了。

list(itertools...在您的示例中有四个迭代器,它们共享相同的底层迭代器。通过构造列表,您有效地耗尽了前三个迭代器来创建第四个,从而使整个事物无法使用。通过删除显式列表,您可以从迭代器步进到迭代器。

相关问题