Creating a list with holes

Chris Angelico rosuav at gmail.com
Fri Jan 3 10:46:04 EST 2014


On Sat, Jan 4, 2014 at 2:38 AM, Roy Smith <roy at panix.com> wrote:
> Why do you want holes?  Is the issue that you're storing sparse data and
> don't want to waste memory on unused keys?  If so, a dictionary should
> do you fine.
>
> Do you need to be able to read the values back out in a specific order?
> You can still do that with a dictionary if you're willing to re-sort the
> keys; that's O(n log n) on the number of keys, but if n is small, it
> doesn't matter.

There's another factor, which is iteration time. Maybe you don't care
about the memory usage, but compare these:

foo = [None]*1000
foo[123] = 234
foo[543] = 432

for key,value in enumerate(foo):
    if value: print("Slot %d is %d"%(key,value))

# versus

foo = {}
foo[123] = 234
foo[543] = 432

for key in sorted(foo.keys()):
    value = foo[key]
    if value: print("Slot %d is %d"%(key,value))

Which one's going to be faster? The dictionary, by far, in this
example. I'm not sure how populated the list would have to be to beat
it (as the dict will get slower on O(n log n) on keys, as you mention,
while the list will run at O(n) on the highest element, which may well
be a constant), but it's something to consider.

ChrisA



More information about the Python-list mailing list