为每个for循环创建一个新的列表

5
每次循环运行时,我希望创建一个新的列表。
#Reading user input e.g. 10
lists = int(raw_input("How many lists do you want? "))
for p in range(0,pooled):
    #Here I want to create 10 new empty lists: list1, list2, list3 ...

有没有更智能的方法来完成这项任务?

谢谢,

Kasper


1
给所有回复者(至少到目前为止):OP 没有 要求一个列表的列表。他要求有10个单独的列表!(如果不清楚,请查看我的答案)。 - mac
5
@mac:是的,但这是不好的做法。 - phant0m
@phantOm - 能否表达清楚一些?他可能需要这样做,但并没有在问题中解释原因。 - mac
1
@mac OP可能并没有明确要求一个列表的列表,但我猜这基本上就是他/她想要的。让问题变得比必要的更复杂是没有意义的。 - Peter Collingridge
@mac:“他可能因为某种原因没有在问题中解释而需要这样做。” 这是我们面临的第一个问题,他正在寻求解决方案,使他对这个实际问题的解决方案起作用!至于不良做法:我看不出任何理由,为什么你想要动态地将它们放入当前命名空间中。如果再次访问它们只能通过与最初获取它们时相同的丑陋机制(如您的答案中所见),那么您为什么要这样做呢?您无法可靠地引用它们为list1,list2等,因为您不知道它们是否存在。 - phant0m
4个回答

8

使用列表推导式:

num_lists = int(raw_input("How many lists do you want? "))
lists = [[] for i in xrange(num_lists)]

对,但这不是 OP 所要求的。:( - mac
3
问题在于,原帖的作者正在遇到解决问题方案的问题,并请求解决前者,而不是询问如何解决他实际的问题。 - phant0m
3
@mac:OP可能确实要求按照某种模式列出名称的列表,但由于这个要求并没有强调得那么多,我认为不应该给出负分。这是Pythonic的解决方案。 - Fred Foo

4
最简单的方法是创建一个列表嵌套列表:
   num_lists = int(raw_input("How many lists do you want? "))
   lists = []
   for p in range(num_lists):
        lists.append([])

然后你可以通过list[2]访问列表3,例如,通过list[2][i]访问列表3的第i个项目。


这绝不是最简单的方法,但在我看来,-1有点太严厉了。 - Fred Foo
@larsmans 我的意思是最简单的解决方案是创建一个列表的列表(我认为这是正确的)。列表推导可能是实现这一点最简单的方法,尽管可能不是最容易理解的方法。 - Peter Collingridge
1
是的,创建一个列表的列表确实是最简单、最好的解决方案。我喜欢教新的Python用户关于列表推导式,因为它们展示了一种干净、面向表达的风格,在Python开发者中越来越受欢迎。 - Fred Foo
1
@larsmans 是的,你可能是对的。就我个人而言,我喜欢列表推导式。 - Peter Collingridge

1

也许在你的情况下,你可以使用一个defaultdict?

>>> from collections import defaultdict
>>> m=defaultdict(list)
>>> m
defaultdict(<type 'list'>, {})
>>> for i in range(5):
...     len(m[i])
... 
0
0
0
0
0
>>> m
defaultdict(<type 'list'>, {0: [], 1: [], 2: [], 3: [], 4: []})

为什么是-1?这是一个完全合理的答案,而defaultdict可能对OP有用。 - phant0m
我没有给你的回答点踩,但我认为对于一个初学者来说,使用defaultdict是过度工程化的。 - Fred Foo
谢谢你的回答!我的初步计划是使用单个列表名称,但我意识到一个列表的列表已足够满足我的需求。 - user838744
@user838744:“足够”- 对于你来说,这并不是“足够”,在这种情况下,你几乎总是想要这个。另一个选项既不容易管理也不可取。 - phant0m

1
为了创建我们的列表,我们会即时生成名称并将它们分配给空列表:
lists = int(input("How many lists do you want? "))
varname = 'list'
for i in range(lists):
    exec(f"{varname}{i} = []")
exec(f'print(f"list{lists-1} is", list{lists-1})')
# list9 is []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接