Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表中最长单词的长度_Python_String_Performance_List_Coding Style - Fatal编程技术网

Python 列表中最长单词的长度

Python 列表中最长单词的长度,python,string,performance,list,coding-style,Python,String,Performance,List,Coding Style,要计算最长单词的长度,哪种方法更像是python方法: len(max(words,key=len)) 或: max(len(w)表示w,大写) 或者。。还有别的吗words是字符串列表。 我发现我需要经常这样做,在对几个不同的样本大小进行计时后,第一种方法似乎始终更快,尽管表面上看起来效率较低(被调用两次的len的冗余似乎无关紧要-在这种形式的C代码中会发生更多吗?) 我得说 len(max(x, key=len)) 看起来相当不错,因为您使用了内置(max)的关键字参数(key)和内置(l

要计算最长单词的长度,哪种方法更像是python方法:

len(max(words,key=len))

或:

max(len(w)表示w,大写)

或者。。还有别的吗
words
是字符串列表。 我发现我需要经常这样做,在对几个不同的样本大小进行计时后,第一种方法似乎始终更快,尽管表面上看起来效率较低(被调用两次的
len
的冗余似乎无关紧要-在这种形式的C代码中会发生更多吗?)

我得说

len(max(x, key=len))
看起来相当不错,因为您使用了内置(
max
)的关键字参数(
key
)和内置(
len
)。所以基本上,
max(x,key=len)
几乎可以得到答案。但在我看来,您的代码变体中没有一个看起来特别不符合Python。

尽管:

max(len(w) for w in words)
“阅读”更容易——你有发电机的开销

而:

len(max(words, key=len))

可以使用内置键进行优化,而且由于
len
通常是非常有效的字符串操作,因此速度会更快…

仅用于使用
ipython%timeit的信息

In [150]: words
Out[150]: ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat']

In [148]: %timeit max(len(w) for w in words)
100000 loops, best of 3: 1.87 us per loop

In [149]: %timeit len(max(words, key=len))
1000000 loops, best of 3: 1.35 us per loop
刚刚更新了更多的文字来展示@Omnifarious的观点/评论

In [160]: words = map(string.rstrip, open('/usr/share/dict/words').readlines())

In [161]: len(words)
Out[161]: 235886

In [162]: %timeit max(len(w) for w in words)
10 loops, best of 3: 44 ms per loop

In [163]: %timeit len(max(words, key=len))
10 loops, best of 3: 25 ms per loop

我认为两者都可以,但我认为除非速度是一个重要的考虑因素,否则
max(len(w)代表w)是最具可读性的

当我看着它们的时候,我花了更长的时间才弄清楚len(max(words,key=len))
在做什么,直到我进一步思考,我还是错的。除非有充分的理由,否则代码应该立即变得显而易见

从其他帖子(以及我自己的测试)可以清楚地看出,可读性较差的帖子速度更快。但他们两个都不慢。除非代码处于关键路径,否则就不值得担心

归根结底,我认为更具可读性更具蟒蛇风格


另一方面,对于相同的任务,这是Python2明显比Python3快的少数几种情况之一。

如果将生成器表达式重写为
map
调用(或者,对于2.x,
imap
):

…它实际上比密钥版本快一点,而不是慢一点

python.org 64位3.3.0:

In [186]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [188]: %timeit max(len(w) for w in words)
%10000 loops, best of 3: 90.1 us per loop
In [189]: %timeit len(max(words, key=len))
10000 loops, best of 3: 57.3 us per loop
In [190]: %timeit max(map(len, words))
10000 loops, best of 3: 53.4 us per loop
苹果64位2.7.2:

In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [299]: %timeit max(len(w) for w in words)
10000 loops, best of 3: 99 us per loop
In [300]: %timeit len(max(words, key=len))
10000 loops, best of 3: 64.1 us per loop
In [301]: %timeit max(map(len, words))
10000 loops, best of 3: 67 us per loop
In [303]: %timeit max(itertools.imap(len, words))
10000 loops, best of 3: 63.4 us per loop
我认为它比
版本更具python风格,原因与genexp相同

它是否像genexp版本一样具有Python功能还存在争议。有些人喜欢
地图
/
过滤器
/
减少
/等等。;有些人讨厌他们;我个人的感觉是,当你试图映射一个已经存在并且有一个好名字的函数时(也就是说,你不需要
lambda
partial
up),
map
更好,但是YMMV(特别是如果你的名字是Guido)

最后一点:

两次调用len的冗余似乎无关紧要——在这种形式的C代码中会发生更多的情况吗


这样想吧:你已经打了N次电话了。与你必须做的任何事情相比,称它为
N+1
次几乎不可能有什么不同,除非你有一小部分巨大的字符串。

我知道已经一年了,但无论如何,我想到了这个:

''编写一个函数find_longest_word(),该函数包含一个单词列表和 返回最长的长度。“”


@我个人更喜欢后者,看起来更漂亮。len(max(words,key=len))
很好,因为它是一个哦,我忘记了max把key作为参数。一般来说,python与英语配合得很好,所以如果你能看懂它,并且它很清楚,你可能会很好。1.len最大字数,或2个。麦克斯·伦的文字。@monkut:但第一个更像是“伦的文字的麦克斯”。但为什么呢?有什么原因吗?@A.R.S.:加了一个简短的,嗯。。。主观原因。尽管如此——我不能说哪个更“Pythonic”——我两个都喜欢,但对于不熟悉
max
with
key
的人来说,也许前者会更容易理解,因为列表越长,差异越大。
max(map(len,words))
的可读性和明显性也很强。所以它得到了我的投票。@Omnifarious:它对我和你们来说都是可读的和显而易见的……但也许不是每个人都这么认为。在我的测试中,3.3.0在我能想到的每一个版本中都超过了2.7.2。更新:事实上,如果我在32位模式下运行它们,3.3.0的速度会明显慢一些。但在32位的3.2或3.3中,几乎所有的东西都显得很慢,至少在Mac上是这样,所以我不认为这有什么特别的地方。@abarnert:很有趣。我在Linux系统上以64位模式运行了它们。一个是Python2.7.3,另一个是3.3.0。我用
/usr/share/dict/words
作为单词列表。我的速度是88毫秒对66毫秒。也许是我选择了一个很长的单词列表,才产生了不同。@Omnifarous:使用70000个单词而不是700个单词,我得到了几乎完全相同的性能数字乘以100。基本上,64位3.3比64位2.7快8-14%,但32位3.3比32位2.7慢0-10%(32位和64位2.7彼此相差不超过2%)。(然而,正如您所料,PyPy使用70000似乎比使用700做得好得多……我没有将其包括在我的答案中,因为我测试的机器没有用于PyPy的ipython。)
In [298]: words = ['now', 'is', 'the', 'winter', 'of', 'our', 'partyhat'] * 100
In [299]: %timeit max(len(w) for w in words)
10000 loops, best of 3: 99 us per loop
In [300]: %timeit len(max(words, key=len))
10000 loops, best of 3: 64.1 us per loop
In [301]: %timeit max(map(len, words))
10000 loops, best of 3: 67 us per loop
In [303]: %timeit max(itertools.imap(len, words))
10000 loops, best of 3: 63.4 us per loop
a = ['mamao', 'abacate', 'pera', 'goiaba', 'uva', 'abacaxi', 'laranja', 'maca']

def find_longest_word(a):

    d = []
    for c in a:
        d.append(len(c))
        e = max(d)  #Try "min" :D
    for b in a:
        if len(b) == e:
            print "Length is %i for %s" %(len(b), b)