如何使用zip迭代x个列表

时间:2015-06-10 07:48:40

标签: python zip

我有几个需要迭代的列表。我的zip功能非常好用,但是为了让我的代码更灵活,我想知道如何使用zip,但是从变量中获取列表的数量?

例如,而不是:

for 1,2,3 in zip(list_1,list_2,list3):
    do something

我们可以做更多的事情:

i = 1   
var = number of lists 
zipall = zip(all_my_lists)


for i in range(1,var) in zip(zipall):
    do something

这段代码甚至没有接近工作,我只是想知道我希望能做的事情。 任何提示将非常感谢。提前谢谢。

更新

感谢目前为止的提示。看起来使用*函数可能对我有用。 到目前为止,我正在尝试让我的zip语句的前半部分工作:

args = [0,1]
for i in range(*args) in zip(outputlist[0],outputlist[1]):
    print range(*args)

但是以“for”开头的行给出了以下错误:

TypeError: 'bool' object is not iterable

知道我哪里错了吗?非常感谢你们的帮助。

2 个答案:

答案 0 :(得分:1)

您可能对*和**感兴趣: What does ** (double star) and * (star) do for parameters?

  • 基本上转换一个列表并在函数调用中将所有转换为参数。

所以:

MYFUNC(1,2,3)

相同

MYFUNC(* [1,2,3])

如果你有一个已定义数量的变量和一个已定义的范围,这是没有意义的,但是如果你有一个可变数量的参数,请使用* arg压缩列表并迭代所有这些参数。

编辑:你现在做错了一些事。

目前,这会修复您的代码,但我怀疑这是您的意图。

def myfunc(*args):    # this passes an arbitrary number of values
    length = len(args)
    # you cannot add a second "in:, this makes a comparison
    # like 5 > 4, or something, which returns a boolean value
    for i in range(0, length):
        do_something(i)       # this does something to the index

我相信这是你的目标:对所有名单做点什么:

def myfunc(*args):
    for arg in args:       # grabs each list sequentially
        do_something(arg)

答案 1 :(得分:0)

首先,需要指定实际列表,或者在另一个集合中,以便您可以动态访问它们。假设您有一个列表列表,您可以轻松执行以下操作:

all_lists = [range(2),
             range(2),
             range(2)]

def zip_test(sentinal=1):
    for items in zip(*all_lists[:sentinal]):
        print items

# demonstration
>>> zip_test(1)
(0,)
(1,)
>>> zip_test(2)
(0, 0)
(1, 1)
>>> zip_test(3)
(0, 0, 0)
(1, 1, 1)