微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

手动 python zip() 函数如何结束这段代码?

如何解决手动 python zip() 函数如何结束这段代码?

我正在 python rn 中创建自己的 zip() 函数。当我想自动化可迭代数时,我被卡住了。 这是我的代码

    def myzip(*iterables):
       new_list = []
       x = len(iterables)
       n = len(iterables[0])
       for i in range(n):
          new_list.append((iterables[0][i],iterables[1][i],iterables[2][i]))
       return new_list    
    myzip([1,2,3,4],'afhj',[1,4]) 

所以这里的输出是好的:[(1,'a',1),(2,'f',2),(3,'h',3),(4,'j',4)] . 但我想要做的是自动化这条线:

    new_list.append((iterables[0][i],iterables[2][i]))

因为我不想指定每个可迭代对象。 如何做到这一点?

解决方法

你可以使用

new_item = tuple(iterable[i] for iterable in iterables)
new_list.append(new_item)

代替

new_list.append((iterables[0][i],iterables[1][i],iterables[2][i]))

这就像一个 list comprehension,但它创建了一个元组。

正如@MisterMiyagi 所评论的,请注意 myzip 不处理可迭代对象。您的函数将处理序列,包括列表、元组和字符串。

,

如果您要拥有可变数量的可迭代对象,则需要处理所有这些对象(不仅仅是前 3 个),因此您应该使用列表推导式来操作它们。

您还应该将您的函数实现为生成器,这样您就不会在返回给调用者之前使用所有组合值构建一个庞大的结果列表。

这是一个例子:

def myZip(*iterables):
    iterables = [*map(iter,iterables)] # convert parameters to iterators
    Done   = object()                  # end of iteration flag
    while True:
       zipped = tuple(next(i,Done) for i in iterables) # advance all iterators
       if Done in zipped: break                        # stop when one is done
       yield zipped                                    # return combinations

输出:

print(*myZip([1,2,3],"abcd","xyz"))

(1,'a','x') (2,'b','y') (3,'c','z')

如果您依赖参数的长度,则不应将它们称为可迭代的,因为该函数将仅限于可索引的集合/数组(列表、范围、元组)。它将不支持实际的可迭代对象(例如生成器、推导式等)。

def myZip(*array):
    result = []
    for i in range(min(map(len,array))):    # index range (shortest)
        zipped = tuple(a[i] for a in array) # combine arrays at index
        result.append(zipped) # build list of zipped tuples
    return result

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。