给定作为字典的直方图,按字典中定义的频率对仅包含字典中元素的列表进行排序的最 Pythonic、“包含电池”的方法是什么?
字典的键(以及列表中的隐含值)是字符串,频率存储为整数。
我只对 python2 解决方案感兴趣,但也欢迎您编写 python 解决方案,因此其他人也可以从中受益(将来)。
给定作为字典的直方图,按字典中定义的频率对仅包含字典中元素的列表进行排序的最 Pythonic、“包含电池”的方法是什么?
字典的键(以及列表中的隐含值)是字符串,频率存储为整数。
我只对 python2 解决方案感兴趣,但也欢迎您编写 python 解决方案,因此其他人也可以从中受益(将来)。
>>> inList = [1,2,3,4,5]
>>> inDict = {1:5, 2:2, 3:4, 4:1, 5:3}
>>> sorted(inList, key=lambda x: inDict.get(x,0))
[4, 2, 5, 3, 1]
这还具有对不在dict中的元素进行排序的好处,就好像它在dict中的值为0一样,而不是仅仅引发KeyError
该sorted()
函数有一个可选参数'key'。此参数指定一个参数的函数,用于从每个列表元素中提取比较键。此比较键用于确定元素之间的排序。
在生成直方图时,我通常会使用collections.Counter
具有内置.most_common()
方法的 。您可以将类似计数器的字典传递给 Counter,它会按照您想象的方式工作。
>>> test_dict = {1: 6, 2: 8, 3: 2, 4: 4, 5: 8, 6: 4, 7: 10, 8: 3, 9: 7}
>>> c = Counter(test_dict)
# returns a list of tuples with the (item, count) values.
>>> c.most_common()
[(7, 10), (2, 8), (5, 8), (9, 7), (1, 6), (4, 4), (6, 4), (8, 3), (3, 2)]
# if you want only the counts:
>>> [count for item, count in c.most_common()]
[10, 8, 8, 7, 6, 4, 4, 3, 2]
# if you want only the objects:
>>> [item for item, count in c.most_common()]
[7, 2, 5, 9, 1, 4, 6, 8, 3]
# if you want them in reverse order
>>> [item for item, count in c.most_common()][::-1]
[3, 8, 6, 4, 1, 9, 5, 2, 7]
从基于列表的输入中创建原始计数的某个子集的计数器对象是微不足道的。您可以使用一个函数:
def return_count_from_list(oldcount, my_list):
count = Counter()
for i in my_list:
count[i] = oldcount[i]
return count
或者,如果您只想要结果,您可以像这样包含您的列表:
my_list = [1, 4, 5]
>>> [count for item, count in c.most_common() if item in my_list]
[8, 6, 4]