Python中的列表排序。非常简单

时间:2014-02-17 19:19:47

标签: python string list

我有一个如下所示的列表:

input= ['canter creant cretan nectar',
        'opt top pot',
        'preprosessing' ,
        'subessential suitableness']

我希望输出为

output= ['subessential suitableness',
         'canter creant cretan nectar',
         'opt top pot']

因此,我希望按照单词的长度重新排序输入。由于“subssential”是最长的单词,它应该放在最初等等。Meawhile,我需要消除'prerosessing',因为它是一个单身人士

我尝试使用.join()并拆分。我是python的新手,我花了一段时间来搜索和尝试,但它仍然无法正常工作。我希望你能帮忙!

2 个答案:

答案 0 :(得分:2)

您可以sorted() key函数来确定每个条目的排序'值':

output = sorted(input, key=lambda l: len(l.split(None, 1)[0]), reverse=True)

会对每个短语中第一个单词的长度进行排序; reverse=True确保首先对最长的单词进行排序。

.split(None, 1)将分割限制为第一个单词;也不需要分割其余部分。

演示:

>>> input = ['canter creant cretan nectar', 'opt top pot', 
...          'subessential suitableness']
>>> sorted(input, key=lambda l: len(l.split(None, 1)[0]), reverse=True)
['subessential suitableness', 'canter creant cretan nectar', 'opt top pot']

从输入列表中删除单个单词是一个单独的问题;在生成器表达式或列表推导中过滤列表:

no_singletons = [p for p in with_singletons if ' ' in p]

将两者合并为:

>>> input = ['canter creant cretan nectar', 'opt top pot', 'preprosessing', 
...          'subessential suitableness']
>>> sorted((p for p in input if ' ' in p), key=lambda l: len(l.split()[0]),
...        reverse=True)
['subessential suitableness', 'canter creant cretan nectar', 'opt top pot']

其中生成器表达式预过滤输入列表。

答案 1 :(得分:0)

更简单,更快速的解决方案:

sorted( (x for x in input if ' 'in x),
        key = lambda x: -x.find(' '))
# time: 100


sorted( (x for x in input if ' 'in x),
        key = lambda x: x.find(' '),reverse=True)
# time: 107


sorted((p for p in input if ' ' in p),
       key=lambda l: len(l.split()[0]),
       reverse=True)
# time: 133