我正在尝试将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)])]
我们可以看到这些组是空的或者是单个整数。
哪里出错?
答案 0 :(得分:1)
问题是list(itertools.groupby(x, keyfunc))
中的列表。放下它就可以了。
list(itertools...
在您的示例中有四个迭代器,它们共享相同的底层迭代器。通过构造列表,您有效地耗尽了前三个迭代器来创建第四个,从而使整个事物无法使用。通过删除显式列表,您可以从迭代器步进到迭代器。