data = ['str', 'frt']
max(data, key=len)
max 函数只返回一个字符串。
我怎样才能让它返回两个字符串?
两个字符串的长度相等,所以max
应该返回两个字符串,但它只返回一个,所以有没有办法返回所有最大项目?
您可以将其写为列表理解:
data = ['str', 'frt']
maxlen = max(map(len, data))
result = [s for s in data if len(s) == maxlen]
这是一个简单的函数,它一次性完成:
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
根据定义,max 函数返回最大值。它不返回项目,只返回唯一的值(即使有多个项目具有相同的最大值)。我建议您使用排序算法并获取您需要的任何值。
在您的示例中:
data = ['str','frt']
sorted(data,key=len, reverse=True)
result = [s for s in data if len(s)==len(data[0])]