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

2024-04-18 21:13:23 发布

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

我有一个列表如下:

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

我希望输出是

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

因此,我想根据单词的长度对输入进行重新排序。因为“subessential”是最长的单词,所以它应该放在第一位等等。同时,我需要消除“preposessing”,因为它是一个单字

我尝试使用.join()和split。我是python新手,我花了一段时间来搜索和尝试,但它仍然不起作用。希望你能帮忙!你知道吗


Tags: 列表inputoutput排序top单词optpot
2条回答

更简单更快的解决方案:

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

您可以给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']

其中生成器表达式预过滤输入列表。你知道吗

相关问题 更多 >