2013-07-24 51 views
-1

给定值的列表,如下所示:排序重复数数字

n = [0, 0, 1, 2, 2, 3] 

什么是排序这样的列表,以最快的方式:

y = [0, 1, 2, 3, 0, 2] 

换句话说,我想值分组,以便首次出现的值的第一次出现,第二次出现的第二次出现,等等,并按组中的值排序。

+9

你会怎么排序'N = [0,0,1,1,2,2,3,3,4,5] –

+0

你需要一把钥匙实际上是排序 - 为什么是订单? – jdotjdot

+2

你需要澄清。所有的数字都有相同的固定数量吗?他们也是连续的吗? – yelsayed

回答

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] 

也许......不知道它也是最快的,可能不工作,你如何期望,如果你不如果你想有一个列表具有非常呈三角值,你在你的问题

1

把正替代值,这将做到这一点:

n = sorted(n) # optionally sort n 
n[0::2] + n[1::2] 
+0

这和'n [:: 2] * 2'没什么区别。我认为这个问题没有明确的概括。 – RussW

2

当我明白你的问题,你想组的值到n组,其中组n包含了所有每个值的n次出现,然后进行排序价值与i在团体中。这样做:

>>> 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] 

我不确定它是最快的;就地排序可能会更快,但是这给了你基本的想法。

0

我提议的算法:

  • 在非递减顺序给出整数的排序列表
  • 返回相同的列表进行排序,使得整数是不降低,并尽可能连续整数不同
  • 它在时间和班次(它扫描输入列表的两倍)
  • 它不是特定于python
  • 它处理丢失的数字

例子

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] 

它每次遇到一个新的元素(此处整数)它会记住它,并 什么它计算它出现在出现的次数输入。

然后它在原始输入上连续写入每个元素的一个出现直到列表已满。

我也写了一个受国旗问题启发的另一个版本(所以用索引列表插入元素),但它并不比这更好,也许不那么清晰。

没有更好的来到我的脑海doh ...

算法

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)