繁体   English   中英

理解Python列表理解的问题

[英]Problem in understanding Python list comprehensions

最后一行在以下代码中是什么意思?

import pickle, urllib                                                                                                                                                     

  handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
  data = pickle.load(handle)
  handle.close()

  for elt in data:
         print "".join([e[1] * e[0] for e in elt])

我对问题的尝试:

  • “” .join ...使用join方法来清空文本
  • e [1] * e [0]将序列中的两个后续值相乘
  • 我不确定是什么
  • 我不知道这是什么意思,如果您在-loop之前有一些内容,例如: e[1] * e[0] for e in elt

也许最好用一个例子来解释:

print "".join([e[1] * e[0] for e in elt])

是...的缩写

x = []
for e in elt:
  x.append(e[1] * e[0])
print "".join(x)

列表推导只是for循环的语法糖,它使语句由一系列语句组成。

elt可以是任意对象,因为您可以从泡菜中加载它, e也是如此。 用法表明它是一种序列类型,但是它可以是实现序列协议的任何东西。

首先,您需要在URL前面加上http://,即:

handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")

表达式[e for e in a_list]是一个列表 [e for e in a_list] ,它生成值列表。

对于Python字符串, *运算符用于重复字符串。 尝试将命令一个接一个地输入解释器,然后查看数据:

>>> data[0]
[(' ', 95)]

这向我们显示了每一行数据都是一个包含两个元素的元组。

因此,表达式e[1] * e[0]有效是在串e[0]重复e[1]次。

因此,程序绘制了一个横幅。

[e[1] * e[0] for e in elt]是一个列表[e[1] * e[0] for e in elt] ,它通过循环遍历另一个列表(在这种情况下为elt来评估列表本身。 新列表中的每个元素都是e[1]*e[0] ,其中eelt的对应元素。

这个问题本身已经得到了完整的回答,但是我想补充一点,列表理解还支持过滤。 你原来的台词

print "".join([e[1] * e[0] for e in elt])

例如,可以成为

print "".join([e[1] * e[0] for e in elt if len(e) == 2])

仅对具有两个元素的elt项目进行操作。

join()是一个字符串方法,适用于新字符串中的分隔符

>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'

并且列表理解没有必要,生成器就足够了

安迪是一个很好的答案!

如果要查看循环的每个步骤(带有换行符),请尝试以下操作:

for elt in data:
    for e in elt:
        print "e[0] == %s, e[1] == %d, which gives us:  '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM