在使用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.
这是我的问题,还是我不了解的行为?
那么,你的test_length()功能不会做同样的事情max()呢,max()当给定的输入是字符串,返回从输入,而不是一个具有最大长度字典序最大的元素.
一个简单的例子来说明这一点 -
>>> a = 'aaaaaaaaaa'
>>> b = 'b'
>>> max(a,b)
'b'
Run Code Online (Sandbox Code Playgroud)
您的test_length()函数基于字符串的长度工作,这与其不同max().
max()还支持key可以传递函数对象的参数,该函数对象将用于确定输入中的最大元素.在您的情况下,您可以传入以len对max()字符串的长度进行处理,示例 -
>>> a = 'aaaaaaaaaa'
>>> b = 'b'
>>> max(a,b,key=len)
'aaaaaaaaaa'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |