【发布时间】:2018-02-12 11:16:04
【问题描述】:
输入是一个未排序的元组列表:
x = [('herr', 1),
('dapao', 1),
('cino', 1),
('o', 38),
('tiao', 2),
('tut', 1),
('poh', 6),
('micheal', 1),
('orh', 1),
('horlick', 3),
('si', 1),
('tai', 1),
('titlo', 1),
('siew', 17),
('da', 1),
('halia', 2)]
目标是找到计数最少的最后一个n 键,即所需的输出:
['orh', 'si', 'tai', 'titlo', 'da']
我试过这样做:
- 首先将元组列表转换为字典
- 将字典转换成计数器
- 然后从
Counter.most_common()中找到[-n:]元组列表 - 将元组列表从
[-n:]转换为字典 - 获取密钥,然后将其转换为列表
即
n = 5
list(dict(Counter(dict(x)).most_common()[-n:]).keys())
有没有更简单的方法来获得相同的输出?
我也可以这样做:
from operator import itemgetter
output, *_ = zip(*sorted(x, key=itemgetter(1))[n:])
list(output)
但现在我只是将Counter.most_common 换成了sorted 和itemgetter。然后我仍然需要 zip(*list) 通过从 zip 之后的每个元组列表中解压缩第一个值来提取键。
一定有更简单的方法。
注意
请注意,问题不是要排序,而是要在给定的原始元组列表中提取列表第一个元素。并且提取的标准是基于在第 2 个元素中具有最低值的最后第 n 项。
answers from the possible duplicate linked 仍然需要解包已排序元组列表并提取第一个元素列表的前 n 个的步骤。
【问题讨论】:
-
这些值
'kup', 'gor', 'beer', 'hor', 'jia'与您的输入元组有何关联? -
您的代码没有产生您想要的输出。
-
@Lomtrur,在按值排序之后,还有更多步骤来获取最后/前几个键 =)
-
@Goyo , RomanPerekhrest,请原谅复制+粘贴的错误。更正了输出。
标签: python list dictionary counter