How to create an array which can be used also as a dictionary

H

Hans Müller

Hello,

I have a lot of items having a name and a given sequence.

To access these items fast in a sequence order they should be used as
a list, but to be fetched fast by name they also should be in a
dictionary.

Code could be something like this.

class item
def __init__(name, value1, value2, value3):
self.name = name
self.value1 = value1
self.value2 = value2

a = []
a.append(item("foo", "bar", "text1"))
a.append(item("xyz", "basd", "tsddsfxt1"))
a.append(item("aax", "hello", "dont care"))

in a, i have my objects in given order, fast accessible by index, e.g.
a[2] to get the third one. Fine.

Now I'd like to have a dict with references to thes objects like this:

d = {}
for x in a:
d[a.name] = a # do I get a copy of a here or a new reference ?!

In d i now have a dict, fast accessible by name.
But what happens if i modify
a[1].value1 = 1000
is
d["aax"].value1 now 1000 or still "hello" as in this example ?

Any ideas to get access to the SAME object by index (0..n-1) AND by key ?

Emphasis here is on speed.


Thanks a lot,

Hans
 
D

Diez B. Roggisch

Hans said:
Hello,

I have a lot of items having a name and a given sequence.

To access these items fast in a sequence order they should be used as
a list, but to be fetched fast by name they also should be in a
dictionary.

Code could be something like this.

class item
def __init__(name, value1, value2, value3):
self.name = name
self.value1 = value1
self.value2 = value2

a = []
a.append(item("foo", "bar", "text1"))
a.append(item("xyz", "basd", "tsddsfxt1"))
a.append(item("aax", "hello", "dont care"))

in a, i have my objects in given order, fast accessible by index, e.g.
a[2] to get the third one. Fine.

Now I'd like to have a dict with references to thes objects like this:

d = {}
for x in a:
d[a.name] = a # do I get a copy of a here or a new reference ?!

Only a reference.
In d i now have a dict, fast accessible by name.
But what happens if i modify
a[1].value1 = 1000
is
d["aax"].value1 now 1000 or still "hello" as in this example ?

It's changed. Didn't you try that?

Diez
 
H

Hans Müller

Diez said:
Hans said:
Hello,

I have a lot of items having a name and a given sequence.

To access these items fast in a sequence order they should be used as
a list, but to be fetched fast by name they also should be in a
dictionary.

Code could be something like this.

class item
def __init__(name, value1, value2, value3):
self.name = name
self.value1 = value1
self.value2 = value2

a = []
a.append(item("foo", "bar", "text1"))
a.append(item("xyz", "basd", "tsddsfxt1"))
a.append(item("aax", "hello", "dont care"))

in a, i have my objects in given order, fast accessible by index, e.g.
a[2] to get the third one. Fine.

Now I'd like to have a dict with references to thes objects like this:

d = {}
for x in a:
d[a.name] = a # do I get a copy of a here or a new reference ?!

Only a reference.
great, this is in my case what I'm looking for.
In d i now have a dict, fast accessible by name.
But what happens if i modify
a[1].value1 = 1000
is
d["aax"].value1 now 1000 or still "hello" as in this example ?

It's changed. Didn't you try that?

Diez
to be true, no - not in this direct context.

btw. how can I get a copy when I need it ?

Thanks a lot, Hans
 
T

Terry Reedy

Hans said:
Hello,

I have a lot of items having a name and a given sequence.

To access these items fast in a sequence order they should be used as a
list, but to be fetched fast by name they also should be in a dictionary.

Have you looked at namedtuple or OrderedDict in collections module?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top