我有几个需要迭代的列表。我的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
知道我哪里错了吗?非常感谢你们的帮助。
答案 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)