lst = [str1, str2, str3, ...]
max(lst, key=len)
这只返回一个最大长度的字符串。如果没有定义另一个程序,有没有办法做到这一点?
答案 0 :(得分:4)
怎么样:
maxlen = len(max(l, key=len))
maxlist = [s for s in l if len(s) == maxlen]
答案 1 :(得分:3)
如果要获取 all 具有最大长度的值,您可能希望按长度对列表进行排序;那么你只需要取所有值,直到长度发生变化。 itertools
提供了多种方法 - takewhile
,groupby
等。例如:
>>> l = ['abc', 'd', 'ef', 'ghi', 'j']
>>> l2 = sorted(l, key=len, reverse=True)
>>> groups = itertools.groupby(len, l2)
>>> maxlen, maxvalues = next(groups)
>>> print(maxlen, list(maxvalues))
3, ['abc', 'ghi']
如果你想要一个单行:
>>> maxlen, maxvalues = next(itertools.groupby(len, sorted(l, key=len, reverse=True)))
>>> print(maxlen, list(maxvalues))
当然,如果您愿意,您可以随时在列表上进行两次传递 - 首先找到最大长度,然后找到所有匹配值:
>>> maxlen = len(max(l, key=len))
>>> maxvalues = (value for value in l if len(value) == maxlen)
>>> print(maxlen, list(maxvalues))
答案 2 :(得分:1)
为了完整起见,filter
也是一个选项:
maxlens = filter(lambda s: len(s)==max(myList, key=len), myList)
答案 3 :(得分:0)
这是一个单程解决方案,收集发现时间最长的单词。
def findLongest(words):
if not words:
return []
worditer = iter(words)
ret = [next(worditer)]
cur_len = len(ret[0])
for wd in worditer:
len_wd = len(wd)
if len_wd > cur_len:
ret = [wd]
cur_len = len_wd
else:
if len_wd == cur_len:
ret.append(wd)
return ret
以下是一些测试列表的结果:
tests = [
[],
"Four score and seven years ago".split(),
"To be or not to be".split(),
"Now is the winter of our discontent made glorious summer by this sun of York".split(),
]
for test in tests:
print test
print findLongest(test)
print
[]
[]
['Four', 'score', 'and', 'seven', 'years', 'ago']
['score', 'seven', 'years']
['To', 'be', 'or', 'not', 'to', 'be']
['not']
['Now', 'is', 'the', 'winter', 'of', 'our', 'discontent', 'made', 'glorious', 'summer', 'by', 'this', 'sun', 'of', 'York']
['discontent']