我正在尝试解决以下问题:函数采用列表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]
答案 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)
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]]