Google Gruppi non supporta più i nuovi post o le nuove iscrizioni Usenet. I contenuti storici continuano a essere visibili.

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

0 visualizzazioni
Passa al primo messaggio da leggere

Hans Müller

da leggere,
10 set 2009, 10:55:0710/09/09
a
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

Diez B. Roggisch

da leggere,
10 set 2009, 11:30:4810/09/09
a
Hans Müller wrote:

> 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

Hans Müller

da leggere,
10 set 2009, 15:51:2410/09/09
a
Diez B. Roggisch wrote:
> Hans Müller wrote:
>
>> 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

Chris Rebert

da leggere,
10 set 2009, 15:59:2710/09/09
a Hans Müller, pytho...@python.org
On Thu, Sep 10, 2009 at 12:51 PM, Hans Müller <hein...@web.de> wrote:
> Diez B. Roggisch wrote:
>> Hans Müller wrote:
<snip>

>>> 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?
>>
> to be true, no - not in this direct context.
>
> btw. how can I get a copy when I need it ?

The `copy` module:
http://docs.python.org/library/copy.html

Cheers,
Chris
--
http://blog.rebertia.com

Terry Reedy

da leggere,
10 set 2009, 18:26:4710/09/09
a pytho...@python.org
Hans Müller wrote:
> 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?

0 nuovi messaggi