这对于“我在[...]”循环代码中的作用是什么?

时间:2010-06-23 05:06:12

标签: python

我是python的新手,任何人都可以解释以下语法,

               for i in [line.split('"') for line in open('a.txt')]:
                    ......
                    ......
                    ......

7 个答案:

答案 0 :(得分:6)

afile = open('a.txt')
for line in afile:
    for field in line.split('"'):
        # do something

在如此难以理解的表达中,将这样一个简单的概念挤在一起真的没有多少理由。

答案 1 :(得分:4)

文件a.txt打开并逐行读取 对于文件中的每一行,该行将分为"个字符 - >我们称之为这些代币 缩进块中的代码行可能会以某种方式使用这些标记

简而言之,tis会将文件内容解析为用换行符或引号字符分隔的标记。

如果输入文件是:

ab"cdef"g
h"ijk"lmno"p
q

..程序将返回令牌:

ab
cdef
g\n
h
ijk
lmno
p\n
q\n

答案 2 :(得分:4)

将名称极其严重的i更改为fields后,原始代码相当于:

file_handle = open('a.txt') # open the file
for line in file_handle: # iterate over lines in the file
    fields = line.split('"') # split line into fields
    # === End of equivalent code ===
    # Now do something with fields, for example:
    for field in fields:
        # Now do something with field

以原始代码的方式使用列表理解是混淆效率低下。如上面的等效代码所示,根本不需要列表理解。原始代码构建了一个临时列表,可能会在占用大量内存很长一段时间后立即迭代并最终丢弃。

注意:当前接受的答案不正确。 (1)原始代码一次不产生字段/令牌;每个i将引用一个列表字段(2)字段不是分隔的换行符;实际上每行的最后一个字段(可能是最后一行除外)将包含换行符。见下文。

如果输入文件是:

ab"cdef"g
h"ijk"lmno"p
q

然后我的“价值”将是

['ab', 'cdef', 'g\n']
['h', 'ijk', 'lmno', 'p\n']
['q\n']

除此之外:用引号分隔的字段相当不寻常,不是吗?

答案 3 :(得分:1)

尝试使用this sample等部分中的运行块。

答案 4 :(得分:1)

嗯,首先,如果您使用文件a.txt运行代码,您会得到什么:

“这个”,是一个“测试”
在这里,我们再次“开始” “引用线”
没有报价?

['','这',',是','测试','\ n']
['我们','去','再次\ n'] ['','引用行','\ n']
['而且没有引号?\ n']

因此,您将获得每行的列表,其中行列表包含字符串的内容除以引用"字符。

所以尝试运行这些:

for line in open('a.txt'):
    print line

因此,它将迭代a.txt文件的行,该文件已被打开调用。

for line in open("a.txt"):
    line_parts = [line.split('"') for line in open('a.txt')]
    print line_parts

第二行是所谓的List Comprehension,并将在文件的每一行上运行split方法。

所以,既然你看到了这些的输出,你就可以看到为什么它正在做它正在做的事情。如果这有任何意义,请告诉我。我有几杯饮料:)

答案 5 :(得分:1)

除了判断调用是否混淆,理解它你需要在python中查找列表理解,以及那里使用的函数。

列表理解是一种在某些情况下以可读性为代价创建性能和字符占用效率高的列表的方法。

IE:你有一个列表[1,2,3],你想要一个包含相同元素且每个添加1的元素,你可以做类似的事情

originalList = [1,2,3,4]
newList = [x+1 for x in originalList]
print newList

当你引入lambdas和multidimensionality时,这会变得更有趣(偶尔会变得不可读)。

考虑到这一点,要解决这一行代码,你必须向后看。 在这种情况下,open()将获取文本文件的内容。 因此,对于open()中的行捕获返回值,并对其进行迭代,为每个迭代提供一行文件,这是示例中的“原始列表中的x”部分。

迭代器的内容,在列表推导中,是一个字符串,有一个split方法,在那里使用。

在方括号之间的该段的末尾,您有一个元素列表(来自拆分),这些元素最初用'“'分隔,并且每个元素都是列表推导创建的列表中的条目。< / p>

然后在“for i in []”中再次重复该列表理解的结果。

答案 6 :(得分:0)

它将逐行读取文件'a.txt'并使用分隔符'“'将其拆分。拆分将产生一个列表。一旦读取完成,拆分的结果将分配给'i'即列表清单。

Example:
Personal firewall "software may warn about the connection IDLE
Personal firewall "software" may warn about the connection IDLE
Personal "firewall" "software may warn about the" connection IDLE
Output:
['Personal firewall ', 'software may warn about the connection IDLE\n'] ['Personal firewall ', 'software', ' may warn about the connection IDLE\n'] ['Personal ', 'firewall', ' ', 'software may warn about the', ' connection IDLE\n']