在不使用Python的zip函数的情况下并行迭代两个迭代器?

在不使用Python的zip函数的情况下并行迭代两个迭代器?,python,iterator,iteration,generator,Python,Iterator,Iteration,Generator,在python中,并行迭代到迭代器的惯用方法是使用zip函数 Python 3.6.5 (default, Mar 31 2018, 19:45:04) [GCC] on linux >>> it1 = range(0,5) >>> it2 = range(3,10) >>> for x1, x2 in zip(it1, it2): print('', x1, x2, sep='\t') ... 0 3

在python中,并行迭代到迭代器的惯用方法是使用zip函数

Python 3.6.5 (default, Mar 31 2018, 19:45:04) [GCC] on linux
>>> it1 = range(0,5)
>>> it2 = range(3,10)
>>> for x1, x2 in zip(it1, it2): print('', x1, x2, sep='\t')
... 
        0       3
        1       4
        2       5
        3       6
        4       7
>>> it1 = range(0,5)
>>> it2 = range(3,10)
>>> [ 100*x1 + x2 for x1,x2 in zip(it1,it2) ]
[3, 104, 205, 306, 407]
然而,我不喜欢这里的模式,这种模式将项目的名称分配与压缩iterable中项目的顺序分离:在更复杂的示例中,可能会很容易产生错误,例如

for apple1, apple2, orange in zip(apples, oranges, more_apples): ...
因此我想知道是否有一种模式,允许类似于

for apple1 in apples,\
    apple2 in oranges,\
    orange in more_apples: ...
这样的错误会更加明显

对于列表理解,存在类似的语法,但对应于itertools.product而不是zip。

关于:

[100 * it1[i] + it2[i] for i in range(min(len(it1), len(it2)))]

如果您的条目是长度相等的列表,那么您可以使用

使用zip,您可以执行以下操作:

l1 = ['a', 'b','c']
l2 = ['A','B','C']

result = [e1+' '+e2 for e1, e2 in zip(l1, l2)]
print(result)
df = pd.DataFrame({'l1': l1, 'l2':l2})
得到

['a A', 'b B', 'c C']
或者,您可以将这两个列表组合成一个pd.DataFrame,如下所示:

l1 = ['a', 'b','c']
l2 = ['A','B','C']

result = [e1+' '+e2 for e1, e2 in zip(l1, l2)]
print(result)
df = pd.DataFrame({'l1': l1, 'l2':l2})
请注意,每个列表还必须使用一个以上的名称,但与zip用法不同,行的l1旁边确实有“l1”

现在,您可以迭代数据帧中的行或执行其他操作。。。简单地

result = [row['l1']+' '+row['l2'] for _, row in df.iterrows()]

这将给出相同的结果。

作为与问题无关的评论:像it1=range0,5这样的行不需要多次,因为它们不是生成器,也不会耗尽。至于你的问题,一个解决办法是在第一个列表中使用enumerate,然后通过索引从其他列表中获取元素。。。这可能是一种替代方法,但处理不同长度的文件不会像使用zip那样优雅。@Chris如果苹果、橙子都是迭代器,并且无法编制索引,并且预期的元素数使包装到可索引容器中变得不可行,那么它也不会起作用。当向下投票时,请说明原因。这使得元素和可迭代元素之间的距离更大,OP试图将其最小化。实际上,在特定的玩具示例中,它可以工作,但当it1、it2未绑定到名称,或者通用迭代器无法索引时,它会崩溃。@DeepSpace根据我从问题中了解的情况,他的问题是,他可能会混淆拉链内外的物品顺序,这会导致错误,而在我的解决方案中,范围内的物品顺序没有意义。。。功能的一些主要缺点:冗长。但是,对于pandas.DataFrame{'l1':l1,'l2':l2}.iterrows中的{ur,r,这可以改进为[f'{r.l1}{r.l2}'。b依赖性。我觉得,仅仅为了滥用熊猫而增加一个像熊猫这样的主要依赖性并不是一个好主意。不同的语义。迭代器必须具有相同的长度,并且该长度必须是有限的。此外,该结果必须足够小,以便表能够放入内存中。不过,这个想法很有趣:我想要的是,可以通过一个自定义zip函数来实现,该函数返回某种记录或集合.namedtuple,这样它就可以用作[ft.l1,t.l2 for t in namedzipl1=iter1,l2=iter2]。为了代码可读性,如果内置zip函数支持的话,我还是更愿意这样做。我不认为将两个数组对齐在一起是滥用dataframe的目的,我也不认为内联dataframe定义有利于可读性,但最大的问题确实是语义-相同的长度,有限长度,所有这些问题。如果内置zip函数支持这一点肯定会更好;我只是不认为有这样的解决办法。