gpt4 book ai didi

python - 按 Python 中的计数对多个列表的元素进行排名

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:18 25 4
gpt4 key购买 nike

我想根据元素在每个列表中出现的频率对多个列表进行排名。示例:

列表 1 = 1,2,3,4
列表 2 = 4,5,6,7
列表 3 = 4,1,8,9

result = 4,1,2,3,4,5,6,7,8(4算三次,1算两次,其余算一次)

我已经尝试了以下方法,但我需要更智能的东西,并且我可以用任何数量的列表来做。


l = []
l.append([ 1, 2, 3, 4, 5])
l.append([ 1, 9, 3, 4, 5])
l.append([ 1, 10, 8, 4, 5])
l.append([ 1, 12, 13, 7, 5])
l.append([ 1, 14, 13, 13, 6])

x1 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[3])
x2 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[4])
x3 = set(l[0]) & set(l[1]) & set(l[3]) & set(l[4])
x4 = set(l[0]) & set(l[2]) & set(l[3]) & set(l[4])
x5 = set(l[1]) & set(l[2]) & set(l[3]) & set(l[4])
set1 = set(x1) | set(x2) | set(x3) | set(x4) | set(x5)

a1 = list(set(l[0]) & set(l[1]) & set(l[2]) & set(l[3]) & set(l[4]))
a2 = getDifference(list(set1),a1)
print a1
print a2

现在问题来了...我可以用 a3、a4 和 a5 一次又一次地做,但它太复杂了,我需要一个函数...但我不知道如何...我的数学卡住了 ;)

已解决:非常感谢您的讨论。作为一个新手,我不知何故喜欢这个系统:快速+信息丰富。你帮了我大忙!泰

最佳答案

import collections

data = [
[1, 2, 3, 4, 5],
[1, 9, 3, 4, 5],
[1, 10, 8, 4, 5],
[1, 12, 13, 7, 5],
[1, 14, 13, 13, 6],
]

def sorted_by_count(lists):
counts = collections.defaultdict(int)
for L in lists:
for n in L:
counts[n] += 1

return [num for num, count in
sorted(counts.items(),
key=lambda k_v: (k_v[1], k_v[0]),
reverse=True)]

print sorted_by_count(data)

现在让我们概括它(接受任何可迭代、放宽可散列的要求),允许键和反向参数(以匹配排序),并重命名为 freq_sorted :

def freq_sorted(iterable, key=None, reverse=False, include_freq=False):
"""Return a list of items from iterable sorted by frequency.

If include_freq, (item, freq) is returned instead of item.

key(item) must be hashable, but items need not be.

*Higher* frequencies are returned first. Within the same frequency group,
items are ordered according to key(item).
"""
if key is None:
key = lambda x: x

key_counts = collections.defaultdict(int)
items = {}
for n in iterable:
k = key(n)
key_counts[k] += 1
items.setdefault(k, n)

if include_freq:
def get_item(k, c):
return items[k], c
else:
def get_item(k, c):
return items[k]

return [get_item(k, c) for k, c in
sorted(key_counts.items(),
key=lambda kc: (-kc[1], kc[0]),
reverse=reverse)]

例子:

>>> import itertools
>>> print freq_sorted(itertools.chain.from_iterable(data))
[1, 5, 4, 13, 3, 2, 6, 7, 8, 9, 10, 12, 14]
>>> print freq_sorted(itertools.chain.from_iterable(data), include_freq=True)
# (slightly reformatted)
[(1, 5),
(5, 4),
(4, 3), (13, 3),
(3, 2),
(2, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (12, 1), (14, 1)]

关于python - 按 Python 中的计数对多个列表的元素进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com