无法在Python中创建自己的“zip”函数

时间:2016-01-20 05:56:50

标签: python list iteration

作为个人练习我试图创建自己的小zip()函数,它接受两个列表并将项目放入元组列表中。换句话说,如果这些是我的清单:

fr = [6,5,4]
tr = [7,8,9]

我希望如此:

[(6,7), (5,8), (4,9)]

这是我的代码:

def zippy(x, y):
    zipper = []
    for i in x :
        for g in y:
            t = (i,g)
        zipper.append(t)

我得到的是:[(6, 9), (5, 9), (4, 9)], 但是当我在函数内部定义列表时,它按预期工作。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:2)

使用索引访问同一索引项:

def zippy(x, y):
    zipper = []
    for i in range(len(x)):
        zipper.append((x[i], y[i]))
    return zipper

使用list comprehension

def zippy(x, y):
    return [(x[i], y[i]) for i in range(len(x))]
>>> fr = [6,5,4]
>>> tr = [7,8,9]
>>> zippy(fr, tr)
[(6, 7), (5, 8), (4, 9)]

答案 1 :(得分:1)

我建议使用range()循环遍历数组的每个索引。然后,将它们放入元组并将它们附加到数组中。

def zippy(x, y):
    zipper = []
    for i in range(len(x)) :
        zipper.append((x[i],y[i]))
    return zipper

有关range()的更多信息,请转到here

答案 2 :(得分:1)

您需要同时迭代两个数组以从两个数组中获取相同的索引

 def zippy(x, y):
        zipper = []
        for i,g in zip(x,y):
            t = (i,g)
            zipper.append(t)
        print(zipper)

输出

[(6, 7), (5, 8), (4, 9)]

答案 3 :(得分:1)

请注意,如果您有两个不同长度的列表,则在最短的序列结束时您的zip应该停止。以下是如何执行此操作的示例:

def zippy(x, y):
    iter1 = iter(x)
    iter2 = iter(y)
    while True:
        yield next(iter1) next(iter2)

请注意标准zip函数返回而不是完整的数据列表!这意味着如果您需要从结果中获取数据,则必须将zip结果转换为list:

result = zip(fr, tr)
print(list(result))

或在其上调用迭代器

next(result)

答案 4 :(得分:1)

# A zip() is a kind of map()!
def zippy(a, b):
  return map(lambda (i, a): (a, b[i]), enumerate(a))