Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
手动python zip()函数。如何结束这段代码?_Python_Python 3.x - Fatal编程技术网

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

手动python zip()函数。如何结束这段代码?,python,python-3.x,Python,Python 3.x,我正在用python rn生成自己的zip()函数。当我想自动生成iterables编号时,我被卡住了。 这是我的密码: 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],

我正在用python rn生成自己的zip()函数。当我想自动生成iterables编号时,我被卡住了。 这是我的密码:

    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,2,3,4]) 
所以这里的输出是好的:[(1,'a',1),(2,'f',2),(3,'h',3),(4,'j',4)]。 但我想做的是使这条生产线自动化:

    new_list.append((iterables[0][i], iterables[1][i], iterables[2][i]))
因为我不想指定每个iterable。 如何做到这一点?

您可以使用

new_item=tuple(iterable[i]表示iterable中的iterable)
新建\u列表。追加(新建\u项)
而不是

new_list.append((iterables[0][i]、iterables[1][i]、iterables[2][i]))
这就像一个元组,但它创建了一个元组


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

如果你要有一个可变数量的ITerable,你需要处理所有的序列(不仅仅是前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')
如果依赖于参数的长度,则不应将其称为iterables,因为函数将限于可索引集合/数组(列表、范围、元组)。它不支持实际的iterables(如生成器、理解等)


请注意,iterables没有长度,并且不可转位
myzip
不适用于生成器。另外,您假设第一个iterable是最短的。是的,在本练习中,我假设所有iterable都具有相同数量的元素。感谢您的提醒@mistermiagi.doc提供了一个实现
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