在zip中跳过一个元素

0 投票
3 回答
1982 浏览
提问于 2025-04-15 16:48

我有两个文件,它们被压缩成了一个文件,类似于下面这样:

for line in zip(open(file1), open(file2)):
    # do-something

不幸的是,现在第二个文件发生了变化,开头多了一行。是的,我可以手动去掉那一行(或者用一个额外的脚本/程序),但因为涉及的文件数量非常多,我更希望在这个层面上解决问题。

所以,我想要的东西类似于下面这个(如果open(file)可以像列表那样使用的话,这样是有效的):

for line in zip(open(file1), open(file2)[1:]):
    # do-something

3 个回答

1
f1 = open(file1)
f2 = open(file2)
f2.next()   # Skip the first line of file2 (used to be readline() - thanks, Alex)
for line in zip(f1, f2):
    # do-something

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

4

open 函数会给你一个迭代器,所以它不能像列表那样通过下标来访问,但你可以很容易地让它向前移动一步(在 Python 2.6 或更高版本中可以用 next 这个内置函数,旧版本则用 .next() 方法——这里假设你用的是 2.6 或更高版本)。

所以如果你想这样写:

for line in zip(open(file1), open(file2)[1:]):

可以改成这样:

f2 = open(file2)
next(f2)
for line in zip(open(file1), f2):

或者,如果你喜欢一行代码的话:

import itertools as it
for line in it.izip(open(file1), it.islice(open(f2), 1, None)):

在后一种情况下,因为我已经在导入 itertools 了,所以我也顺便用它的 izip 方法,而不是那个浪费内存的 zip 内置函数;-)。

2

看看这个itertools库:

for line in itertools.izip(
    open(file1),
    itertools.islice(open(file2), 1, None)
    ):
    # do something

补充:把原来的zip函数改成了itertools.izip函数。

撰写回答