Python列表按组大小排序

2024-05-13 01:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组标记为item_labels = [('a', 3), ('b', 2), ('c', 1), ('d', 3), ('e', 2), ('f', 3)]

我想按组的大小来分类。e、 例如,上例中标签3的尺寸为3,标签2的尺寸为2。在

我尝试使用groupbysorted的组合,但是没有用。在

In [162]: sil = sorted(item_labels, key=op.itemgetter(1))

In [163]: sil
Out[163]: [('c', 1), ('b', 2), ('e', 2), ('a', 3), ('d', 3), ('f', 3)]

In [164]: g = itt.groupby(sil,)
Display all 465 possibilities? (y or n)

In [164]: g = itt.groupby(sil, key=op.itemgetter(1))

In [165]: for k, v in g:
   .....:     print k, list(v)
   .....:
   .....:
1 [('c', 1)]
2 [('b', 2), ('e', 2)]
3 [('a', 3), ('d', 3), ('f', 3)]

In [166]: sg = sorted(g, key=lambda x: len(list(x[1])))

In [167]: sg
Out[167]: [] # not exactly know why I got an empty list here

我总是可以写一些乏味的for循环来完成这项工作,但我宁愿找一些更优雅的东西。有什么建议吗?如果有有用的库,我很乐意使用它。e、 g.,pandasscipy


Tags: keyinforlabels尺寸标签outitem
3条回答

在python2.7及更高版本中,使用Counter:

from collections import Counter
c = Counter(y for _, y in item_labels)
item_labels.sort(key=lambda t : c[t[1]])

在python2.6中,为了我们的目的,这个Counter构造函数可以使用defaultdict(由@perreal建议)实现,方法如下:

^{pr2}$

由于我们只处理数字,并且假设数字与示例中的数字一样低,我们实际上可以使用一个列表(它将与更旧版本的Python兼容):

def Counter(x):
    lst = list(x)
    d = [0] * (max(lst)+1)
    for v in lst: d[v]+=1
    return d

没有计数器,您可以简单地执行以下操作:

item_labels.sort(key=lambda t : len([x[1] for x in item_labels if x[1]==t[1] ]))

虽然速度较慢,但比短名单合理。在


有空列表的原因是g是一个生成器。只能对其进行一次迭代。在

from collections import defaultdict
import operator
l=[('c', 1), ('b', 2), ('e', 2), ('a', 3), ('d', 3), ('f', 3)]
d=defaultdict(int)
for p in l: d[p[1]] += 1
print [ p for i in sorted(d.iteritems(), key=operator.itemgetter(1))
        for p in l if p[1] == i[1] ]

itertools.groupby返回一个迭代器,因此for循环:for k, v in g:实际上使用了该迭代器。在

>>> it = iter([1,2,3])
>>> for x in it:pass
>>> list(it)          #iterator already consumed by the for-loop
[]

代码:

^{pr2}$

要获取扁平化列表,请使用itertools.chain

>>> from itertools import chain
>>> list( chain.from_iterable(new_lis))
[('c', 1), ('b', 2), ('e', 2), ('a', 3), ('d', 3), ('f', 3)]

相关问题 更多 >