Python 2.7 计数器列表

5

我有这样的列表:

Pasang = [0, 4, 4, 5, 1, 7, 6, 7, 5, 7, 4, 9, 0, 10, 1, 10,...., 23, 9, 23, 7, 23]

我从那个列表中计算项目:

satuan = Counter(pasang)

然后我得到:
Counter({5: 10, 6: 7, 0: 5, 1: 5, 7: 5, 10: 4, 11: 4, 15: 4,...,14: 1, 21: 1})

我想从计数器中获取密钥,所以我这样做:
satu = satuan.keys()

我得到了这样的已排序列表:

[0, 1, 2, 4, 5,...,21, 22, 23]

但我需要像这样的输出(未排序):
[5, 6, 0, 1,...,14, 21]

很抱歉我的英语不好。



6
你说的“未排序”是什么意思?看起来你确实想要排序,但是按计数顺序排序,这种情况下请参见Counter.most_common - jonrsharpe
我认为他的意思是“不按数字顺序排序,而是按Counter对象中显示的相同顺序排序。” - Barmar
2个回答

4
你可能需要的是:

您可能需要:

[key for key, freq in c.most_common()]

在此处c是Counter实例。

most_common将以频率递减的顺序返回键和频率对,然后您可以使用推导式提取键部分。


所以为什么 Counter.keys 返回一个已排序的结果? - Mazdak
2
@Kasra 因为这些键是整数,它们会哈希到它们自己的值。 - jonrsharpe
1
@jonrsharpe 仅为防止任何人产生错误的想法:这是一个实现细节,只会发生在某些整数子集上。不要依赖它。 - Veedrac
@Veedrac 提出了一个非常好的观点!这也将部分取决于键的插入数量和顺序。 - jonrsharpe

0
如果您想保持顺序,请查看您刚创建的Counter对象,它按照频率降序排序元素,您还可以通过按频率对键进行排序并将reverse标志设置为True来实现相同的行为。
import collections
Pasang = [0, 4, 4, 5, 1, 7, 6, 7, 5, 7, 4, 9, 0, 10, 1, 10, 23, 9, 23, 7, 23]

a = collections.Counter(Pasang)

keys = sorted(a.keys(), key = lambda x:a[x], reverse = True)
print a
print keys
>>> Counter({7: 4, 4: 3, 23: 3, 0: 2, 1: 2, 5: 2, 9: 2, 10: 2, 6: 1})
>>> [7, 4, 23, 0, 1, 5, 9, 10, 6]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接