给出一个值列表,如下所示:
n = [0, 0, 1, 2, 2, 3]
对列表进行排序的最快方法是:
y = [0, 1, 2, 3, 0, 2]
换句话说,我希望对这些值进行分组,使得第一次出现的值首先出现,第二次出现在第二次,依此类推,其中数字按组中的值排序。
答案 0 :(得分:2)
根据我的理解,您希望将值分组到n
组,其中组n
包含每个值的所有n
次出现,然后按值排序在团体内。这样做:
>>> import collections
>>> def scan_count(l):
... count = collections.defaultdict(int)
... for i in l:
... yield count[i]
... count[i] += 1
...
>>> l = [0, 0, 1, 1, 2, 2, 3, 3]
>>> [b for a, b in sorted(zip(scan_count(l), l))]
[0, 1, 2, 3, 0, 1, 2, 3]
>>> l = [0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3]
>>> [b for a, b in sorted(zip(scan_count(l), l))]
[0, 1, 2, 3, 0, 1, 2, 3, 1, 3, 1, 3]
我不确定它是最快的;就地排序可能会更快,但这为您提供了基本的想法。
答案 1 :(得分:1)
如果您想要一个备用值列表,可以这样做:
n = sorted(n) # optionally sort n
n[0::2] + n[1::2]
答案 2 :(得分:0)
>>> sorted_n = sorted(n)
>>> list_of_lists = [sorted_n [i:i+2] for i in range(0,len(sorted_n),2)]
>>> list(itertools.chain(*zip(*list_of_lists)))
[0, 1, 2, 3, 0, 1, 2, 3]
也许......不确定它是否也是最快的,如果你在你的问题中没有非常类似于你所提出的n的值,那么它可能无法工作
答案 3 :(得分:0)
我提出了一种算法:
<强>实施例强>
input = [0, 0, 1, 1, 2, 2]
output = [0, 1, 2, 0, 1, 2]
input = [0, 2, 2, 3, 4, 4]
output = [0, 2, 3, 4, 2, 4]
它的作用
每当遇到一个新元素(这里是一个整数)时,它就会记住它 它计算它在输入中出现的次数。
然后它连续在原始输入上写入每个元素的一次出现,直到列表已满。
我还写了一个受标志问题启发的其他版本(所以使用索引列表插入元素的位置)但它并不比这更好,也许不太清楚。
没有什么比我更好的了......
算法
def my_sort(ari):
#check if there is something to sort..
if len(ari) < 1:
return ari
#initialize vars..
elements = [ari[0]] #list of found elements
occurences = [1] #occurence[i-th] stores the number of occurrences found for the elements[i-th]
i = 1
while(i < len(ari)):
if (ari[i] != elements[len(elements)-1]):
occurences.append(1)
elements.append(ari[i])
else:
occurences[len(occurences)-1] += 1
i +=1
k = 0
while(k < len(ari)):
for i in range(len(elements)):
if occurences[i] > 0:
ari[k] = elements[i]
occurences[i] = occurences[i] - 1
k += 1
return ari
asd = [0, 2, 2, 3, 4, 4]
print my_sort(asd)