基于整个字符串对AB字符串列表进行排序

时间:2017-10-19 16:56:58

标签: python string list sorting

我有以下列表:

public class ProductModel {

      private String name;
      private int prod_code;
      ....
      //getters/setters
}

public class ProductNutrientModel {

      private double amount; // amount of the nutrient linked to a product
      private int prod_code;
      private int nutrient_id; 
      ....
      //getters/setters
}

public class NutrientModel {

      private int nutrient_id; 
      private String name; // names of the nutrients
      ....
      // Nutrient holds no amount

      //getters/setters
}

我得到了这个:

lst = ['AAAAAABB', 'AAAAAABA', 'AAAAAAAB', 'AAAAABAA', 'AAAAABAB', 'AAAAABBA']

但我想要这样的事情:

lst = ['AAAAAAAB', 'AAAAAABA', 'AAAAAABB', 'AAAAABAA', 'AAAAABAB', 'AAAAABBA']

这意味着,我想通过Python对我的列表进行排序,考虑每个列表项中的A和B的序列。

实际上,我希望首先出现7 * A的所有组合。之后,应该有多个B组合。

2 个答案:

答案 0 :(得分:2)

编辑:我总是忘记这个评论,但这非常重要,不要用名字来调用变量作为" list,dict"等,这些名称对python有特殊意义

编辑:您按照" b"

的数量进行排序

您可以对列表进行排序:

import functools

lst = ['AAAAAABB', 'AAAAAABA', 'AAAAAAAB', 'AAAAABAA', 'AAAAABAB', 'AAAAABBA']

def sort_by_b(a,b):
  ab = a.count('B')
  bb =  b.count('B')
  if (ab == bb and a < b) or ab < bb:
    return -1
  elif ab > bb:
    return 1
  else:
    return a == b

print(sorted(lst, key=functools.cmp_to_key(sort_by_b)))

结果:

['AAAAAAAB', 'AAAAAABA', 'AAAAABAA', 'AAAAAABB', 'AAAAABAB', 'AAAAABBA']

答案 1 :(得分:2)

我想我得到了你想做的事!如果我错了,请纠正我。基本上它取决于B,不是吗? B出现或接近的次数是字符串开头的B越多,它出现在最终答案列表中的距离越远,不是吗?

所以,这就是我的工作。

  • 首先,我得到一个列表,其中字符串按B的频率顺序排序。
  • 这是不够的,因为字符串的顺序在原始列表中很重要。要查看此消息,请从我的答案中删除for循环并打印lst,您将清楚地看到问题。
  • 所以现在我需要sort(正常的词典排序)每组具有相同频率B的字符串。我使用了groupby。查看groupby的用法并对每个此类组进行排序并将其附加到最终答案。

    from itertools import groupby
    
    lst = ['AAAAAABB', 'AAAAAABA', 'AAAAAAAB', 'AAAAABAA', 'AAAAABAB', 'AAAAABBA']
    ans = []
    lst.sort(key=lambda x:x.count('B'))
    for i,j in groupby(lst, lambda x:x.count('B')):
        ans.extend(sorted(list(j)))
    
    print ans 
    

输出:

['AAAAAAAB', 'AAAAAABA', 'AAAAABAA', 'AAAAAABB', 'AAAAABAB', 'AAAAABBA']