我有以下列表:
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组合。
答案 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
的频率顺序排序。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']