473,386 Members | 1,602 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

dictionary containing a list

Ben
Hello...

I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
I hope this makes some sense, and doesn't seem to head bangingly
simple...
Cheers,

Ben

Oct 6 '06 #1
10 2302

Ben wrote:
Hello...

I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
I hope this makes some sense, and doesn't seem to head bangingly
simple...
Do you consult your physician over a video link while wearing a ninja
costume down an unlit coal mine at midnight?

Please consider the possibility that your description of what you think
your code might be doing is not enough for diagnosis.

You may need to supply:
(1) a listing of your code
(2) a small amount of input data
e.g. [(1, 'foo'), (42, 'bar'), (1, 'zot')]
(3) the output you expect from that input:
e.g. {1: ['foo', 'zot'], 42: ['bar']}

Cheers,
John

Oct 6 '06 #2
"Ben" <Be*************@gmail.comwrites:
I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values,
then dumping this list into the dictionary. Or so I thought...
Our crystal balls are notoriously unreliable for viewing program code
that hasn't been posted.

--
\ "For man, as for flower and beast and bird, the supreme triumph |
`\ is to be most vividly, most perfectly alive" -- D.H. Lawrence. |
_o__) |
Ben Finney

Oct 6 '06 #3
Ben wrote:
I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ?
Where you "loop around ... filling [your] list", use a new
list every time. You can create a new empty list with "[]".

--
--Bryan
Oct 7 '06 #4
On 6 Oct 2006 14:37:59 -0700, Ben <Be*************@gmail.comwrote:
Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
Not sure what you're trying to pull off, but you may wish to copy the
items in question. (Questions indeed!). Dictionarys have their own
shallow copy method, surprisingly named copy, and there is also a copy
module that does shallow and deep copy (copy and deepcopy, resp.)

HTH,
Theerasak
Oct 7 '06 #5
I think what you mean is that if you change your list, it is changed
somewhere in your dicrionary to. Lists are always copied as pointers,
except explicitly told other wise. So a = b = [] makes a and be the
same list, and a.append(1) makes b - [1].
So do something like mydict[mykey] = mylist[:] (Slicing gives a copy
of the list, not the pointer).
Hope this helps.

Moi
Dolf

On 6 Oct 2006 14:37:59 -0700, "Ben" <Be*************@gmail.comwrote:
>Hello...

I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
I hope this makes some sense, and doesn't seem to head bangingly
simple...
Cheers,

Ben
Oct 7 '06 #6
John Machin wrote:
Ben wrote:
>>Hello...

I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
I hope this makes some sense, and doesn't seem to head bangingly
simple...


Do you consult your physician over a video link while wearing a ninja
costume down an unlit coal mine at midnight?

Please consider the possibility that your description of what you think
your code might be doing is not enough for diagnosis.

You may need to supply:
(1) a listing of your code
(2) a small amount of input data
e.g. [(1, 'foo'), (42, 'bar'), (1, 'zot')]
(3) the output you expect from that input:
e.g. {1: ['foo', 'zot'], 42: ['bar']}
One of the fascinating things about c.l.py is that sometimes a questin
will be posted that makes almost no sense to me, and somebody else will
casually read the OP's mind, home in on the issue and provide a useful
and relevant answer.

In this case it seems transparent to me, though probably not to you,
that Ben's problem is rootd in the following behaviour, well-known in
python but frequently confusing to noobs:
>>a = [1, 2, 3]
firstlist = a
a.append('another element')
firstlist
[1, 2, 3, 'another element']
>>>
Ben probably needs to look at creating copies using the list() type:
>>a = [1, 2, 3]
firstlist = list(a)
a.append('another element')
firstlist
[1, 2, 3]
>>>
or perhaps, in omore complex circumstances, using the copy module.

regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Oct 7 '06 #7
Steve Holden wrote:
One of the fascinating things about c.l.py is that sometimes a questin
will be posted that makes almost no sense to me, and somebody else will
casually read the OP's mind, home in on the issue and provide a useful
and relevant answer.
if the assertions made by some about the documentation's unsuit-
ability for some are in fact true, that's probably some kind of
natural selection in action.

</F>

Oct 7 '06 #8

Steve Holden wrote:
John Machin wrote:
Ben wrote:
>Hello...

I have set up a dictionary into whose values I am putting a list. I
loop around and around filling my list each time with new values, then
dumping this list into the dictionary. Or so I thought...

It would appear that what I am dumping into the dictionary value is
only a pointer to the original list, so after all my iterations all I
have is a dictionary whose every value is equal to that of the list the
final time I looped around :-(

Is there a way to acheive what I was attempting ? I have done something
almost identical with classes in a list before, and in that case a new
instance was created for each list entry...
I hope this makes some sense, and doesn't seem to head bangingly
simple...

Do you consult your physician over a video link while wearing a ninja
costume down an unlit coal mine at midnight?

Please consider the possibility that your description of what you think
your code might be doing is not enough for diagnosis.

You may need to supply:
(1) a listing of your code
(2) a small amount of input data
e.g. [(1, 'foo'), (42, 'bar'), (1, 'zot')]
(3) the output you expect from that input:
e.g. {1: ['foo', 'zot'], 42: ['bar']}
One of the fascinating things about c.l.py is that sometimes a questin
will be posted that makes almost no sense to me, and somebody else will
casually read the OP's mind, home in on the issue and provide a useful
and relevant answer.

In this case it seems transparent to me, though probably not to you,
that Ben's problem is rootd in the following behaviour, well-known in
python but frequently confusing to noobs:
>>a = [1, 2, 3]
>>firstlist = a
>>a.append('another element')
>>firstlist
[1, 2, 3, 'another element']
>>>
It's quite transparent to me that his symptom is caused by the one list
being used throughout the exercise, instead of one per different dict
key. What you have described is one possibility.

Here's another possibility: Making the charitable assumption that he
has an outer loop and an inner loop, maybe (as I think another poster
has already suggested) all he needs to do is move "mylist = []" inside
the outer loop. Note that he doesn't say explicitly whether the one
list that he gets is the *correct* list for the last key, or whether
it's the catenation of all the correct lists, or something else.

Yet another: Noobs do all sorts of funny things. He could be operating
on a "clean the bucket out after each use instead making a new one"
paradigm:

| >>d= {}
| >>L = []
| >>L.append(1)
| >>L.append(2)
| >>d['a'] = L
| >>d
| {'a': [1, 2]}
| >>del L[:]
| >>d
| {'a': []}
| >>L.append(3)
| >>L.append(4)
| >>d['b'] = L
| >>d
| {'a': [3, 4], 'b': [3, 4]}

Cheers,
John

Oct 7 '06 #9
Ben
I think what you mean is that if you change your list, it is changed
somewhere in your dicrionary to. Lists are always copied as pointers,
except explicitly told other wise. So a = b = [] makes a and be the
same list, and a.append(1) makes b - [1].
So do something like mydict[mykey] = mylist[:] (Slicing gives a copy
of the list, not the pointer).
Hope this helps.

Moi
Dolf

Ah -this is exactly what I was doing wrong -thaks very much! Aologies
also for not posting sooner, I have been away for a few days.

Thanks for all of your help,

Ben

On 6 Oc
John Machin wrote:
Steve Holden wrote:
John Machin wrote:
Ben wrote:
>
>>Hello...
>>
>>I have set up a dictionary into whose values I am putting a list. I
>>loop around and around filling my list each time with new values, then
>>dumping this list into the dictionary. Or so I thought...
>>
>>It would appear that what I am dumping into the dictionary value is
>>only a pointer to the original list, so after all my iterations all I
>>have is a dictionary whose every value is equal to that of the list the
>>final time I looped around :-(
>>
>>Is there a way to acheive what I was attempting ? I have done something
>>almost identical with classes in a list before, and in that case a new
>>instance was created for each list entry...
>>
>>
>>I hope this makes some sense, and doesn't seem to head bangingly
>>simple...
>>
>
>
Do you consult your physician over a video link while wearing a ninja
costume down an unlit coal mine at midnight?
>
Please consider the possibility that your description of what you think
your code might be doing is not enough for diagnosis.
>
You may need to supply:
(1) a listing of your code
(2) a small amount of input data
e.g. [(1, 'foo'), (42, 'bar'), (1, 'zot')]
(3) the output you expect from that input:
e.g. {1: ['foo', 'zot'], 42: ['bar']}
>
One of the fascinating things about c.l.py is that sometimes a questin
will be posted that makes almost no sense to me, and somebody else will
casually read the OP's mind, home in on the issue and provide a useful
and relevant answer.

In this case it seems transparent to me, though probably not to you,
that Ben's problem is rootd in the following behaviour, well-known in
python but frequently confusing to noobs:
>>a = [1, 2, 3]
>>firstlist = a
>>a.append('another element')
>>firstlist
[1, 2, 3, 'another element']
>>>

It's quite transparent to me that his symptom is caused by the one list
being used throughout the exercise, instead of one per different dict
key. What you have described is one possibility.

Here's another possibility: Making the charitable assumption that he
has an outer loop and an inner loop, maybe (as I think another poster
has already suggested) all he needs to do is move "mylist = []" inside
the outer loop. Note that he doesn't say explicitly whether the one
list that he gets is the *correct* list for the last key, or whether
it's the catenation of all the correct lists, or something else.

Yet another: Noobs do all sorts of funny things. He could be operating
on a "clean the bucket out after each use instead making a new one"
paradigm:

| >>d= {}
| >>L = []
| >>L.append(1)
| >>L.append(2)
| >>d['a'] = L
| >>d
| {'a': [1, 2]}
| >>del L[:]
| >>d
| {'a': []}
| >>L.append(3)
| >>L.append(4)
| >>d['b'] = L
| >>d
| {'a': [3, 4], 'b': [3, 4]}

Cheers,
John
Oct 8 '06 #10
"Fredrik Lundh" <fr*****@pythonware.comwrote:

Steve Holden wrote:
One of the fascinating things about c.l.py is that sometimes a questin
will be posted that makes almost no sense to me, and somebody else will
casually read the OP's mind, home in on the issue and provide a useful
and relevant answer.

if the assertions made by some about the documentation's unsuit-
ability for some are in fact true, that's probably some kind of
natural selection in action.

</F>
LOL - Whining about documentation is what programmers do - its driven by the
"fact" that the docs and the implementation are "never" in sync, except on
something that is either trivial, or as old as the hills...

And it does not matter if the software is free and open source, or bought at
great expense - there are always these differences - sometimes niggly, and often
major - it sometimes looks as if the docs were a statement of intent, with the
implementation taking a left turn at the first crossroads.

- Hendrik
- Hendrik

Oct 9 '06 #11

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

90
by: Christoph Zwerschke | last post by:
Ok, the answer is easy: For historical reasons - built-in sets exist only since Python 2.4. Anyway, I was thinking about whether it would be possible and desirable to change the old behavior in...
4
by: Alexandre Brisebois (www.pointnetsolutions.com) | last post by:
Hi, I am currently building a lexical analysis component to pull keywords out of content, I currently have a functional first build, but I am having problems ince I am easily loading over 300...
4
by: Nico Grubert | last post by:
Hi there, I am looking for a way to sort a list containing dictionaries. This is my example list: I want to sort the list by dictionary's key 'from_datetime' so the sorted list should be:
14
by: vatamane | last post by:
This has been bothering me for a while. Just want to find out if it just me or perhaps others have thought of this too: Why shouldn't the keyset of a dictionary be represented as a set instead of a...
11
by: John Henry | last post by:
Hi list, I am sure there are many ways of doing comparision but I like to see what you would do if you have 2 dictionary sets (containing lots of data - like 20000 keys and each key contains a...
7
by: Ben | last post by:
Hello... I have a dictionary, where each value is a seperate instance of the same class: self.mop_list=record(self.mops) In my case I know that record_number takes the values 0,3,and 7...
6
by: asincero | last post by:
Which is better: using an if/else construct to simulate a C switch or use a dictionary? Example: def foo(): if c == 1: doCase1() elif c == 2: doCase2() elif c == 3: doCase3()
5
by: robinsiebler | last post by:
I have a data structure that looks like this: # dates = {'2007': {'25': {'06/23/07': {'aerosmith': , # 'Metallica': }, # 'last_song': }}}...
2
by: Assimalyst | last post by:
Hi I have a Dictionary<string, List<string>>, which i have successfully filled. My problem is I need to create a filter expression using all possible permutations of its contents. i.e. the...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.