48

How can I make many empty lists without manually typing the following?

list1=[], list2=[], list3=[]

Is there a for loop that will make me 'n' number of such empty lists?

1

8 Answers 8

148

A list comprehension is easiest here:

>>> n = 5
>>> lists = [[] for _ in range(n)]
>>> lists
[[], [], [], [], []]

Be wary not to fall into the trap that is:

>>> lists = [[]] * 5
>>> lists
[[], [], [], [], []]
>>> lists[0].append(1)
>>> lists
[[1], [1], [1], [1], [1]]
Sign up to request clarification or add additional context in comments.

10 Comments

Holy wow! we posted this at EXACTLY The same time (mind=blown)
@inspectorG4dget: There should be a badge for that
This creates a list of lists though, not separate variables with different names. Although it is definitely shorter.
Why does the "trap" happen?
I did fall into the trap and you saved me :) Thanks!
|
59

If you want to create different lists without a "list of lists", try this:

list1, list2, list3, list4 = ([] for i in range(4))

2 Comments

list1, list2, list3, list4 = [], [], [], [] is still shorter! TIL you can unpack a generator all at once
for 4 yes, but it is handy if there are more
17

Look up list comprehensions:

listOfLists = [[] for i in range(N)]

Now, listOfLists has N empty lists in it.

More links on list comprehensions:

1 2 3

Comments

8

I see that many answers here get you many lists with no names assigned (as elements of a larger list). This may be not always what's needed.

It is possible to create multiple empty lists, each with a different name/value, using a tuple:

a,b,c = ([],[],[])

Changing this structure should get you what you want.

1 Comment

In Python 3, you could also do a, b, c = [], [], [].
4

The code below will dynamically 'create' itself. For every iteration, the following command will issued:

listnumber = []

Where number is the value of i in the loop.

x = 3 # Amount of lists you want to create
for i in range(1, x+1):
    command = "" # This line is here to clear out the previous command
    command = "list" + str(i) + " = []"
    exec(command)

The result of this particular piece of code is three variables: list1, list2 and list3 being created and each assigned an empty list.

You can generalize this to make practically anything you want. Do note that you cannot put this into a function as far as I know, because of how variables and global variables work.

name = "my_var" # This has to be a string, variables like my_var1, my_var2 will be created.
value = "[]" # This also has to be a string, even when you want to assign integers! When you want to assign a string "3", you'd do this: value = "'3'"
amount = 5 # This must be an integer. This many variables will be created (my_var1, my_var2 ... my_var5).

for i in range(1, amount+1):
    command_variable = ""
    command_variable = name + str(i) + " = " + value
    exec(command_variable)

1 Comment

exec is almost always a really bad idea. If you think about using this code, then change your mind and don't. At the very least, use globals()[varname] = val, if you must dynamically create variables
4

Use this:

def mklist(n):
    for _ in range(n):
        yield []

Usage:

list(mklist(10))
[[], [], [], [], [], [], [], [], [], []]

a, b, c = mklist(3) # a=[]; b=[]; c=[]

Comments

3

Or as simple as

added, modified, removed, inactive = ([],) * 4

2 Comments

This is nice. A little bit more cryptic than "added, mod, rem, inact = [],[],[],[]" but for sure more compact !!!
Becareful, when I use this method, my lists are "connected" in the sense that changing items in "added" will also change "modified and "removed" ... etc. I would suggest the for loop way as suggested by inspectorG4dget
1

You can also add a list of list of list of list... like this too. It won't return any error. But I haven't got any idea what it's used for.

n = 5 
>>> lists = [[[]]] for _ in range(n)]
>>> lists
   [[[[]]], [[[]]], [[[]]], [[[]]], [[[]]]]

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.