基于整个字符串的AB字符串排序列表

2024-10-03 11:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下清单:

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

我明白了:

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

但我想要这样的东西:

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

这意味着,考虑到每个列表项中A和B的序列,我想用Python对我的列表进行排序。你知道吗

实际上,我希望所有7*A的组合都应该先出现。在那之后应该有一个以上B的组合


Tags: 列表排序序列lstaaaaaabbaaaaaaabaaaaababaaaaabaa
2条回答

Edit:我总是忘记这个注释,但它确实很重要,不要用“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']

我想我明白你的意思了!如果我错了,请纠正我。基本上取决于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']

相关问题 更多 >