我有一个如下所示的列表:
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的新手,我花了一段时间来搜索和尝试,但它仍然无法正常工作。我希望你能帮忙!
答案 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