根据频率和值对列表排序

2024-05-16 08:34:03 发布

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

我试图解决以下问题:一个函数接受一个列表a。结果必须是一个列表的有序列表。每个列表包含在原始列表A中具有相同频率的元素

示例:

Input: [3, 1, 2, 2, 4]
Output: [[1, 3, 4], [2, 2]]

我设法对初始列表进行排序,并确定元素的频率。 但是,我不知道如何根据频率拆分原始列表。你知道吗

我的代码:

def customSort(arr):
    counter = Counter(arr)
    y = sorted(arr, key=lambda x: (counter[x], x))
    print(y)
    x = Counter(arr)
    a = sorted(x.values())
    print()

customSort([3,1,2,2,4])

我的电流输出:

[1, 3, 4, 2, 2]
[1, 1, 1, 2]

Tags: 函数元素示例列表inputoutputcounter频率
3条回答

按您的方式对列表进行排序后:

counter = Counter(x)
y = sorted(x, key=lambda x: (counter[x], x))
#[1, 3, 4, 2, 2]

然后可以使用^{},在key参数中使用来自Counter(x)的结果,根据计数创建组:

[list(v) for k,v in groupby(y, key = lambda x: counter[x])]
#[[1, 3, 4], [2, 2]]

您可以使用defaultdict列表并迭代Counter

from collections import defaultdict, Counter

def customSort(arr):
    counter = Counter(arr)
    dd = defaultdict(list)
    for value, count in counter.items():
        dd[count].extend([value]*count)
    return dd

res = customSort([3,1,2,2,4])
# defaultdict(list, {1: [3, 1, 4], 2: [2, 2]})

这提供了附加信息,即键表示列表中的值被看到的次数。如果需要列表列表,只需访问以下值:

res = list(res.values())
# [[3, 1, 4], [2, 2]]

执行Scott Hunter(Python 3)建议的咕哝工作:

#!/usr/bin/env python3
from collections import Counter

def custom_sort(arr):
  v = {}
  for key, value in sorted(Counter(arr).items()):
    v.setdefault(value, []).append(key)
  return [v * k for k,v in v.items()]

if __name__ == '__main__':
  print(custom_sort([3, 1, 2, 2, 4])) # [[1, 3, 4], [2, 2]]

对于Python2.7或更低版本,使用iteritems()而不是items()

部分取自this answer

相关问题 更多 >