如何获得所有maxs max函数

时间:2012-05-30 19:49:05

标签: python max

max('str','frt',key=len)

max函数只返回一个字符串。
如何让它返回两个字符串?
两个字符串的长度是相等的,所以max应该返回两个字符串,但只返回一个,所以有办法返回所有最大项目。

3 个答案:

答案 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