Python 如何得到最大值函数的所有最大值

Python 如何得到最大值函数的所有最大值,python,max,Python,Max,max函数只返回一个字符串。如何使它同时返回两个字符串? 两个字符串的长度相等,因此max应该返回两个字符串,但它只返回一个,因此有办法返回所有max项。您可以将其作为列表编写: max('str','frt',key=len) 根据定义,max函数返回最大值。它不返回项目,只返回唯一的值(即使有多个项目具有相同的最大值)。 我建议您使用排序算法并获取所需的任何值 在您的示例中: data = ['str', 'frt'] maxlen = max(map(len, data)) result

max函数只返回一个字符串。
如何使它同时返回两个字符串?

两个字符串的长度相等,因此max应该返回两个字符串,但它只返回一个,因此有办法返回所有max项。

您可以将其作为列表编写:

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

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

在您的示例中:

data = ['str', 'frt']
maxlen = max(map(len, data))
result = [s for s in data if len(s) == maxlen]

下面是一个简单的函数,它一次完成这一任务:

data = ['str','frt']
sorted(data,key=len, reverse=True)
result = [s for s in data if len(s)==len(data[0])]
在行动中:

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'])

什么意思?你的问题令人困惑。你能给出一个更好的例子,并展示你想要的输出吗?这可能是相关的:你可能不能,你必须编写你自己的函数。
'str'
'frt'
,那么为什么你会期望这两个值?@KarlKnechtel len('str')==len('frt')排序比max需要更多的时间,我想不会太多。就复杂性而言,排序是伪线性的,其中max是线性的,这或多或少是等价的。一旦分类,你可以在数据上做很多很酷的事情,比如查找第二个最大值、最小值、二进制搜索。。。。当然,这取决于您的需要。我添加了一些timeit信息,正如上面所建议的,对于大型数据集,排序速度明显较慢。我不明白在这里使用max实现了什么排序。。。您似乎将其用作效率较低的最大值,因此-1.如果不将结果赋值,则调用
sorted
不会产生任何效果。你的意思是要使用
sort()
?注意:maxlen的计算必须超出列表理解范围(因此只调用一次)。此外,在第二行中使用
max(a,key=len)
比max.map更具pythonic风格(速度稍快)。@yhayden在这种情况下,
maxlen
将是实际的字符串,而不是3,因此,您必须再次调用
len
以获取长度。在这里这样做似乎更合适。
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
In [37]: %timeit maxes2(a)
10000 loops, best of 3: 39.7 µs per loop