Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8294937
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 8, 20262026-06-08T14:24:37+00:00 2026-06-08T14:24:37+00:00

I need to initialize a list of defaultdicts. If they were, say, strings, this

  • 0

I need to initialize a list of defaultdicts. If they were, say, strings, this would be tidy:

list_of_dds = [string] * n

…but for mutables, you get right into a mess with that approach:

>>> x=[defaultdict(list)] * 3
>>> x[0]['foo'] = 'bar'
>>> x
[defaultdict(<type 'list'>, {'foo': 'bar'}), defaultdict(<type 'list'>, {'foo': 'bar'}), defaultdict(<type 'list'>, {'foo': 'bar'})]

What I do want is an iterable of freshly-minted distinct instances of defaultdicts. I can do this:

list_of_dds = [defaultdict(list) for i in xrange(n)]

but I feel a little dirty using a list comprehension here. I think there’s a better approach. Is there? Please tell me what it is.

Edit:

This is why I feel the list comprehension is suboptimal. I’m not usually the pre-optimization type, but I can’t bring myself to ignore the speed difference here:

>>> timeit('x=[string.letters]*100', setup='import string')
0.9318461418151855
>>> timeit('x=[string.letters for i in xrange(100)]', setup='import string')
12.606678009033203
>>> timeit('x=[[]]*100')
0.890861988067627
>>> timeit('x=[[] for i in xrange(100)]')
9.716886043548584
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-08T14:24:39+00:00Added an answer on June 8, 2026 at 2:24 pm

    Your approach using the list comprehension is correct. Why do you think it’s dirty? What you want is a list of things whose length is defined by some base set. List comprehensions create lists based on some base set. What’s wrong with using a list comprehension here?

    Edit: The speed difference is a direct consequence of what you are trying to do. [[]]*100 is faster, because it only has to create one list. Creating a new list each time is slower, yeah, but you have to expect it to be slower if you actually want 100 different lists.

    (It doesn’t create a new string each time on your string examples, but it’s still slower, because the list comprehension can’t “know” ahead of time that all the elements are going to be the same, so it still has to reevaluate the expression every time. I don’t know the internal details of the list comp, but it’s possible there’s also some list-resizing overhead because it doesn’t necessarily know the size of the index iterable to start with, so it can’t preallocate the list. In addition, note that some of the slowdown in your string example is due to looking up string.letters on every iteration. On my system using timeit.timeit('x=[letters for i in xrange(100)]', setup='from string import letters') instead — looking up string.letters only once — cuts the time by about 30%.)

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Do I need to initialize each level of a multi-level list in R? l=list()
to initialize a javascript loaded grid, I need to pass a list of values
I need to initialize ConditionalAnalysisInput based on the selected value from the dropdown list
This is tailing off my other question which was successfully answered: stackoverflow.com/questions/8597929/need-to-create-li-with-list-of-different-links-using-php-explode-method so now
I need to initialize few objects, it can take a while so I want
I'm writing a web application and need to initialize some parameters that I'm pulling
I am writing a program in C++ and I need to initialize an array
In some languages, like php, you don't need to manually initialize each dimension of
To initialize an int array with all zeros, do I need to use: int
me need your adwise: i've got 2 classes, in first I initialize the object

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.