2011-11-14 100 views
5

我有这样的数据:itertools.groupby()

self.data = list: [(1, 1, 5.0), 
        (1, 2, 3.0), 
        (1, 3, 4.0), 
        (2, 1, 4.0), 
        (2, 2, 2.0), 
        (2, 3, 4.0), 
        (2, 5, 3.0), 
        (3, 2, 2.0), 
        (3, 4, 4.0), 
        (3, 5, 3.0)] 

当我运行这段代码:

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(0)): 

list(group)我得到:

list: [(1, 1, 5.0), 
     (1, 2, 3.0), 
     (1, 3, 4.0)] 

这就是我想要的。

但是,如果使用1而不是0

for mid, group in itertools.groupby(self.data, key=operator.itemgetter(1)): 

到组由元组的第二个数字,我只得到:

list: [(1, 1, 5.0)] 

即使是具有“1等的元组“在那1(2)的位置。

回答

12

itertools.groupby收集在一起连续具有相同键的项目。 如果您希望所有项目具有相同的密钥,则必须先排序self.data

for mid, group in itertools.groupby(
    sorted(self.data,key=operator.itemgetter(1)), key=operator.itemgetter(1)): 
+0

我以前在零位上排序。所以我只是在做groupby之前再次排序并且它工作正常。 self.data.sort(key = operator.itemgetter(1)) – user994165

10

没有排序的变体(通过字典)。应该更好地表现明智。

def full_group_by(l, key=lambda x: x): 
    d = defaultdict(list) 
    for item in l: 
     d[key(item)].append(item) 
    return d.items() 
+0

回来张贴相同的东西,我没有看到你的答案!这显然是走的路:) –

相关问题