max('str','frt',key=len)
max函数只返回一个字符串。
如何让它返回两个字符串?
两个字符串的长度是相等的,所以max应该返回两个字符串,但只返回一个,所以有办法返回所有最大项目。
答案 0 :(得分:4)
您可以将其写为列表理解:
data = ['str', 'frt']
maxlen = max(map(len, data))
result = [s for s in data if len(s) == maxlen]
答案 1 :(得分:2)
根据定义,max函数返回最大值。它不返回项目,只返回唯一的值(即使有多个项目具有相同的最大值)。 我建议你使用排序算法并获取你需要的任何值。
在你的例子中:
data = ['str','frt']
sorted(data,key=len, reverse=True)
result = [s for s in data if len(s)==len(data[0])]
答案 2 :(得分:2)
这是一个简单的函数,可以一次完成:
def maxes(a, key=None):
if key is None:
key = lambda x: x
m, max_list = key(a[0]), []
for s in a:
k = key(s)
if k > m:
m, max_list = k, [s]
elif k == m:
max_list.append(s)
return m, max_list
行动中:
In [11]: maxes(['a', 'ab', 'a', 'cd'], key=len)
Out[11]: (2, ['ab', 'cd'])
这可能比运行其他海报提到的列表理解更快,也可能不比分类更快......但是一点点测试表明它更快:
有关字符串的示例:
In [20]: a = [''.join(random.choice('abc') for _ in xrange(random.randint(1, 100)))
for i in xrange(1000)]
In [21]: %timeit maxes(a, key=len)
10000 loops, best of 3: 53 µs per loop
In [22]: %timeit m = max(map(len, a)); [s for s in a if len(s) < m]
10000 loops, best of 3: 104 µs per loop
In [23]: %timeit sorted_a = sorted(a, key=len, reverse=True); [s for s in a if len(s) == len(sorted_a[0])]
1000 loops, best of 3: 322 µs per loop
如果我们用一个键来看整数:
In [30]: a = [random.randint(1, 10000) for i in xrange(1000)]
In [31]: %timeit maxes(a, key= lambda x: x**2)
10000 loops, best of 3: 150 µs per loop
In [32]: %timeit m = max(a, key=lambda x: x**2); [s for s in a if s**2 < m]
1000 loops, best of 3: 183 µs per loop
In [33]: %timeit sorted_a = sorted(a, key=lambda x: x**2, reverse=True); [s for s in a if s ** 2 == sorted_a[0] ** 2]
1000 loops, best of 3: 441 µs per loop
但是,如果没有键,列表理解会更好:
In [34]: %timeit maxes(a)
10000 loops, best of 3: 98.1 µs per loop
In [35]: %timeit m = max(a); [s for s in a if s < m]
10000 loops, best of 3: 49.2 µs per loop
In [36]: %timeit sorted_a = sorted(a, reverse=True); [s for s in a if s == sorted_a[0]]
10000 loops, best of 3: 152 µs per loop
这是预期的,因为冗余密钥代码仍然被应用,如果我们要删除该逻辑(用x替换对key(x)的调用),该函数再次稍微更快:
In [37]: %timeit maxes2(a)
10000 loops, best of 3: 39.7 µs per loop