按频率和值对列表进行排序

时间:2019-01-29 13:11:56

标签: python

我正在尝试解决以下问题:函数采用列表A。结果必须是列表的有序列表。每个列表包含与原始列表A中具有相同频率的元素。

示例:

Input: [3, 1, 2, 2, 4]
Output: [[1, 3, 4], [2, 2]]
我设法对初始列表A进行排序,并确定元素的频率。 但是,我不知道如何根据频率拆分原始列表A。

我的代码:

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]

7 个答案:

答案 0 :(得分: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]]

对于2.7或更低版​​本的Python,请使用iteritems()代替items()

部分取自this answer

答案 1 :(得分: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]]

答案 2 :(得分:2)

已对列表进行了排序:

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

然后您可以使用itertools.groupby,并使用Counter(x)参数中key的结果来根据计数创建组:

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

答案 3 :(得分:1)

  1. 找到最大频率,并创建一个包含那么多空列表的列表。
  2. 遍历您的值,并根据其频率将每个值添加到上述元素中。

Collections中可能有一些内容至少可以满足上述要求。

答案 4 :(得分:0)

同一主题的另一个变体,使用Counter获取计数,然后将元素插入到结果列表列表中的相应位置。这样会保留元素的原始顺序(不会将相同的元素分组在一起),并保留空白列表以供计数。

>>> lst = [1,4,2,3,4,3,2,5,4,4]
>>> import collections
>>> counts = collections.Counter(lst)
>>> res = [[] for _ in range(max(counts.values()))]
>>> for x in lst:
...     res[counts[x]-1].append(x)
...     
>>> res
[[1, 5], [2, 3, 3, 2], [], [4, 4, 4, 4]]

答案 5 :(得分:0)

参加聚会有点晚,但是使用普通的Python:

test = [3, 1, 2, 2, 4]

def my_sort(arr):
    count = {}
    for x in arr:
        if x in count:
            count[x] += 1
        else:
            count[x] = 0


    max_frequency = max(count.values()) + 1
    res = [[] for i in range(max_frequency)]

    for k,v in count.items():
        for j in range(v + 1):
            res[v].append(k)
    return res

print(my_sort(test))

答案 6 :(得分:0)

仅使用Python的内置函数,不使用导入和单个for循环。

l1= []
l2 = []
def customSort(mylist):
    sl = sorted(mylist)
    for i in sl:
        n = sl.count(i)
        if n > 1:
            l1.append(i)
        if i not in l1:
            l2.append(i)
    return [l2, l1]

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

输出:

  

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