Python的内置max()方法的奇怪行为

esf*_*sfy 0 python python-3.x

在使用Python的max()内置方法时,我发现了一件有趣的事情....

input_one = u'A????;B??;??;D??????;E??????????????????'
input_two = u'????;??;??;??????;??????????????????'
input_en = u'test;test,test,test;testtesttest;testtesttesttest'
input_ja = u'??????;???;???????;????????????'
input_ja_mixed = u'a??????;b???;c???????;d????????????'
input_ascii = u'egfwergreger;@#@$fgdfdfdfdsfsdfsdf;sdfsdfsfsdfs233'


def test_length(input):
    lengths = []
    for i in input:
        lengths.append(len(i))
    index = find_index(input, max(lengths))
    return input[index]


def find_index(input, to_find):
    for index, value in enumerate(input):
        print('index: %s, length: %s, value: %s' % (index, len(value), value))
        if len(value) == to_find:
            return index

def test_one(input):
    input = input.split(';')
    print('input:', input)
    print('using test_length: ', test_length(input))
    print('using max():', max(input))
Run Code Online (Sandbox Code Playgroud)

如果max()用于查找仅包含英文字母的列表中的max元素,则效果很好.

但是,如果元素与符号(如@ # $)混合,则表现不同.

例如,

In [80]: test_one(input_ascii)
input: ['egfwergreger', '@#@$fgdfdfdfdsfsdfsdf', 'sdfsdfsfsdfs233']
index: 0, length: 12, value: egfwergreger
index: 1, length: 21, value: @#@$fgdfdfdfdsfsdfsdf
using test_length:  @#@$fgdfdfdfdsfsdfsdf
using max(): sdfsdfsfsdfs233
Run Code Online (Sandbox Code Playgroud)

特例是,中文混合了英文字母:

In [82]: test_one(input_one)
input: ['A????', 'B??', '??', 'D??????', 'E??????????????????']
index: 0, length: 5, value: A????
index: 1, length: 3, value: B??
index: 2, length: 2, value: ??
index: 3, length: 7, value: D??????
index: 4, length: 19, value: E??????????????????
using test_length:  E??????????????????
using max(): ??
Run Code Online (Sandbox Code Playgroud)

该文档未指定该max()方法具有的任何特殊行为.

Python版本是Python 3.4.

这是我的问题,还是我不了解的行为?

Ana*_*mar 5

那么,你的test_length()功能不会做同样的事情max()呢,max()当给定的输入是字符串,返回从输入,而不是一个具有最大长度字典序最大的元素.

一个简单的例子来说明这一点 -

>>> a = 'aaaaaaaaaa'
>>> b = 'b'
>>> max(a,b)
'b'
Run Code Online (Sandbox Code Playgroud)

您的test_length()函数基于字符串的长度工作,这与其不同max().

max()还支持key可以传递函数对象的参数,该函数对象将用于确定输入中的最大元素.在您的情况下,您可以传入以lenmax()字符串的长度进行处理,示例 -

>>> a = 'aaaaaaaaaa'
>>> b = 'b'
>>> max(a,b,key=len)
'aaaaaaaaaa'
Run Code Online (Sandbox Code Playgroud)