6
data = ['str', 'frt']
max(data, key=len)

max 函数只返回一个字符串。

我怎样才能让它返回两个字符串?

两个字符串的长度相等,所以max应该返回两个字符串,但它只返回一个,所以有没有办法返回所有最大项目?

4

3 回答 3

7

您可以将其写为列表理解:

data = ['str', 'frt']
maxlen = max(map(len, data))
result = [s for s in data if len(s) == maxlen]
于 2012-05-30T19:52:33.423 回答
4

这是一个简单的函数,它一次性完成:

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
于 2013-10-29T08:09:29.863 回答
1

根据定义,max 函数返回最大值。它不返回项目,只返回唯一的值(即使有多个项目具有相同的最大值)。我建议您使用排序算法并获取您需要的任何值。

在您的示例中:

data = ['str','frt']
sorted(data,key=len, reverse=True)
result = [s for s in data if len(s)==len(data[0])]
于 2012-05-30T19:53:10.910 回答