我将此列表作为示例:
[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))]
现在我想按ID分组,所以我会使用itemgetter(0)
:
import operator, itertools
from decimal import *
test=[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))]
for _k, data in itertools.groupby(test, operator.itemgetter(0)):
print list(data)
我不知道为什么,但我得到了错误的输出:
[(148, Decimal('3.0'))]
[(325, Decimal('3.0'))]
[(148, Decimal('2.0'))]
[(183, Decimal('1.0'))]
[(308, Decimal('1.0'))]
[(530, Decimal('1.0'))]
[(594, Decimal('1.0'))]
[(686, Decimal('1.0'))]
[(756, Decimal('1.0'))]
[(806, Decimal('1.0'))]
如您所见,输出未按ID分组。但是,如果我使用itemgetter(1)
,上面的代码工作正常。输出按十进制值分组。
[(148, Decimal('3.0')), (325, Decimal('3.0'))]
[(148, Decimal('2.0'))]
[(183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))]
我在这里缺少什么?
答案 0 :(得分:4)
您首先需要排序 groupby 的数据才能正常工作,它会根据您提供的密钥对连续元素进行分组:< / p>
import operator, itertools
from decimal import *
test=[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0')), (183, Decimal('1.0')), (308, Decimal('1.0')), (530, Decimal('1.0')), (594, Decimal('1.0')), (686, Decimal('1.0')), (756, Decimal('1.0')), (806, Decimal('1.0'))]
for _k, data in itertools.groupby(sorted(test), operator.itemgetter(0)):
print list(data)
但是你最好使用dict进行分组以避免不必要的O(n log n)排序:
from collections import defaultdict
d = defaultdict(list)
for t in test:
d[t[0]].append(t)
for v in d.values():
print(v)
两者都会给你相同的分组,但不一定是相同的顺序。
答案 1 :(得分:2)
itertools.groupby()
要求数据一致或排序。
[(148, Decimal('3.0')), (148, Decimal('2.0')), (325, Decimal('3.0'))]
可以使用,但[(148, Decimal('3.0')), (325, Decimal('3.0')), (148, Decimal('2.0'))]
不会,因为ID为148, 325, 148
而不是148, 148, 325
。