-1

给定一个值列表,如下所示:

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

对此类列表进行排序的最快方法是什么:

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

换句话说,我希望将值分组,以便值的第一次出现首先出现,第二次出现在第二次,依此类推,其中的数字按组内的值排序。

4

4 回答 4

2

据我了解您的问题,您希望将值n分组,其中 groupn包含n每个值的所有 th 出现,然后按组内的值排序。这样做:

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

我不确定它是最快的;就地排序可能会更快,但这为您提供了基本思路。

于 2013-07-24T22:44:19.623 回答
1

如果您想要一个备用值列表,可以这样做:

n = sorted(n) # optionally sort n
n[0::2] + n[1::2]
于 2013-07-24T22:34:51.503 回答
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]

它能做什么

每次遇到一个新元素(这里是一个整数)时,它都会记住它并计算它在输入中出现的次数。

然后它连续地在原始输入上写入每个元素的一个匹配项,直到列表已满。

我还写了一个受标志问题启发的另一个版本(所以有一个插入元素的索引列表),但它并不比这更好,而且可能不太清楚。

没有更好的事情浮现在我的脑海里...

算法

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)
于 2013-07-25T11:29:27.243 回答
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 非常相似的值,它可能无法按照您的预期工作

于 2013-07-24T22:20:32.587 回答