繁体   English   中英

使用itertools的两个循环

[英]Using two loops of itertools

我正在尝试运行itertools的两个循环,但出现错误。 这是我的代码:

import itertools
with open('lognew.txt', 'r') as f:
    firstlines = itertools.islice(f, 0, None, 1)
    secondlines = itertools.islice(f, 0, None, 2)

    for (line1 in firstlines) and (line2 in secondlines):
        print line1 + line2 

我收到此错误:

File "C:\Users\abhi\Desktop\logedit.py", line 15
    for (line1 in firstlines) and (line2 in secondlines):
                            ^
SyntaxError: invalid syntax

我想要这样的结果:

<first line in firstlines> is meaning of  <first line in secondlines>
<second line in firstlines>  is meaning of <second line in secondlines>
<third line in firstlines>  is meaning of <third line in secondlines>

读取文件没有错误,因为以下代码成功打印了行。

for line1 in firstlines :
    print line1
for line2 in secondlines :
    print line2

非常感谢您的帮助。

您的切片将无法执行您认为会执行的操作。 第一个切片只给您第一行,第二个切片给您第二行 ,前提是您在第一个切片之后对其进行了迭代。 那是因为输入文件已经前进了一行,所以第二个切片对象将在迭代时跳过其中一个,为您提供下一个。 如果压缩了文件,则需要第1行,第3行,第4行,第6行,依此类推。

您真正想要的是成对线路循环。 为此,您根本不需要使用切片。 使用itertools.izip() ; 它将每两行压缩在一起:

from itertools import izip

with open('lognew.txt', 'r') as f:
    for line1, line2 in izip(f, f):
        print line1.rstrip('\n') + line2

每次迭代时, izip()都会从第一个参数(打开文件对象f )获取一个值,然后从第二个参数( 打开文件对象f )获取一个值。 由于文件对象每次迭代都前进到下一行,因此以上内容有效地为您提供了文件中成对的行。

请注意,如果文件的行数为奇数,则看不到最后一行。 如果需要访问最后一行,请改用itertools.izip_longest()

from itertools import izip_longest

with open('lognew.txt', 'r') as f:
    for line1, line2 in izip_longest(f, f, fillvalue='\n'):
        print line1.rstrip('\n') + line2

如果行数为奇数,它将添加一个空行( fillvalue='\\n' )。

在Python 3中, itertools.izip()取代了内置的zip()函数,并且itertools.izip_longest()已重命名为itertools.zip_longest()

for line1, line2 in itertools.izip(f1, f2):

Python双迭代

暂无
暂无

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

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