首页 > 解决方案 > 使用 zip 进行迭代的空光标

问题描述

我有多个用于迭代的游标,但是当其中一个为空时,zip 不起作用。当一个列表为空时,我如何遍历其他列表。示例代码如下所示:

    for x, y, p, q in zip(cursor_X, cursor_Y,
                              cursor_P, cursor_Q):
    data1 = x
    data2 = y
    data3 = p
    data4 = q
print(str(data1['data']), end="")
print("\t" + str(data2['data']), end="")
print("\t" + str(data2['data']), end="")
print("\t" + str(data2['data']))

标签: python-3.xiterator

解决方案


您可以使用itertools.zip_longest

itertools.zip_longest(*iterables, fillvalue=None)

创建一个迭代器,聚合来自每个可迭代对象的元素。如果可迭代的长度不均匀,则用 fillvalue 填充缺失值。迭代一直持续到最长的可迭代对象用完

您没有显示您的数据是什么样子,但为了使其余代码正常工作,您可以使用带有'data'键和空字符串的 dict 作为缺失数据的值:

from itertools import zip_longest

for x, y, p, q in zip_longest(cursor_X, cursor_Y,
                              cursor_P, cursor_Q,
                              fillvalue={'data':''}):
    data1 = x
    data2 = y
    data3 = p
    data4 = q

    print(str(data1['data']), end="")
    print("\t" + str(data2['data']), end="")
    print("\t" + str(data2['data']), end="")
    print("\t" + str(data2['data']))

请注意,您可以在没有不必要的中间变量的情况下重写循环的内容:

for x, y, p, q in zip_longest(cursor_X, cursor_Y, cursor_P, cursor_Q,
                              fillvalue={'data':''}):    
    out = '\t'.join(map(str, (x, y, z, t)))
    print(out)

甚至:

for items in zip_longest(cursor_X, cursor_Y, cursor_P, cursor_Q,
                         fillvalue={'data':''}):    
    out = '\t'.join(map(str, items))
    print(out)

推荐阅读