繁体   English   中英

如何基于列表中的属性均匀分布对象?

[英]How to Uniformly distribute Objects based on an attribute in a list?

可以说,我有一个对象集合或列表{AABABBCCCDDEEDFFF}

该列表是随机填充的。 现在我要它重新排列列表,如下所示

{ABCDEFABCDEFABCDF}

一种方法是为现有列表中的每个元素创建存储桶,然后遍历每个存储桶,依次选择并添加期望列表中的元素,直到所有存储桶都存在。

您可以动态使用存储桶。 举个例子:

快速版本:

当存储桶和输入序列不为空时:

  1. 获取(A,B,C,D,A,....)中序列X中的下一个属性值
  2. 检查输入序列中的当前位置是否属于属性X,然后将其置于新序列并增加位置,转到1
  3. 如果不为空,则存储桶X从存储桶X进入新序列并移至1
  4. 将物品从当前位置放到合适的铲斗中,增加位置,转到2

较少的内存使用版本

  1. 获取(A,B,C,D,A,....)中序列X中的下一个属性值
  2. 如果不为空,则存储桶X从存储桶X进入新序列并移至1
  3. 检查输入序列中的当前位置是否属于属性X,然后将其置于新序列并增加位置,转到1
  4. 将当前位置的物品放入合适的铲斗,增加位置,转到3

假设输入仅是AZ字母。 因此,在这种情况下,您将只有26个可能的字符。 因此,一旦输入存储在哈希表中,只需使用哈希表存储输入字符的计数。 现在只需使用此函数即可获取输出。

while(哈希中有任何项){

for(i 1至26){

打印每个非零计数字符和减计数

}

}

将对象放到哈希图中,将它们的值作为键,并输入出现次数的计数器(还保留插入顺序)。 然后,要创建输出列表,请在映射中的键上进行迭代并附加每个键值,同时减少其计数。 重复直到地图用尽。 这是python中的代码:

from collections import OrderedDict

def arrange(l):

  d=OrderedDict()
  for x in l:
    d[x]=d.setdefault(x, 0)+1

  r=[]
  while len(d)>0:
    for x in d:
      r.append(x)
      d[x]-=1
      if d[x]==0:
        del d[x]

  return r

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM