Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Help with Dictionaries and Classes requested please.

Reply
Thread Tools

Help with Dictionaries and Classes requested please.

 
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      08-09-2007
Neil Cerutti a écrit :
> On 2007-08-09, special_dragonfly <(E-Mail Removed)> wrote:
>> Is there anyway for python to consider the values within a
>> string when entering the data into a dictionary. I know that
>> isn't very clear so here's an example:
>>
>> class MyClass(object):
>> def __init__(self,name="",age=""):
>> self.name=name
>> self.age=age
>>
>> data="Gary,50"
>> d={0:[MyClass(data)]}
>> data="Adam,25"
>> d[0].append(MyClass(data))
>>
>> The data is coming from a text file working on a line by line
>> basis. I've just tried and I'm just getting the full string in
>> the first field. That seems logical, now I don't want it to
>> though!

>
> That's what happens if you use 0 for the key every time.


Hmmm... Neil, I may be wrong but I think you didn't get the point here.
As I understand it, Dominic's problem is that it gets strings like
"Gary,50" and would like to call MyClass initializer this way :
MyClass("Gary", "50")

 
Reply With Quote
 
 
 
 
Neil Cerutti
Guest
Posts: n/a
 
      08-09-2007
On 2007-08-09, Bruno Desthuilliers <(E-Mail Removed) > wrote:
> Neil Cerutti a écrit :
>> On 2007-08-09, special_dragonfly <(E-Mail Removed)> wrote:
>>> Is there anyway for python to consider the values within a
>>> string when entering the data into a dictionary. I know that
>>> isn't very clear so here's an example:
>>>
>>> class MyClass(object):
>>> def __init__(self,name="",age=""):
>>> self.name=name
>>> self.age=age
>>>
>>> data="Gary,50"
>>> d={0:[MyClass(data)]}
>>> data="Adam,25"
>>> d[0].append(MyClass(data))
>>>
>>> The data is coming from a text file working on a line by line
>>> basis. I've just tried and I'm just getting the full string in
>>> the first field. That seems logical, now I don't want it to
>>> though!

>>
>> That's what happens if you use 0 for the key every time.

>
> Hmmm... Neil, I may be wrong but I think you didn't get the
> point here. As I understand it, Dominic's problem is that it
> gets strings like "Gary,50" and would like to call MyClass
> initializer this way : MyClass("Gary", "50")


My guess was he doesn't need a class at all, but needed to decide
what he's mapping from->to. It seems far-fetched to me that he
*really* wants a mapping between an index and MyClass objects
containing name and age.

So I tried to cut out the middle-man. Hopefully we can get some
closure on this.

--
Neil Cerutti
 
Reply With Quote
 
 
 
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      08-09-2007
special_dragonfly a écrit :
> "Bruno Desthuilliers" <(E-Mail Removed) >
> wrote in message news:46baf183$0$433$(E-Mail Removed)...
>> special_dragonfly a écrit :
>> (snip)

(and resnip)

> Hello
> To answer first Bjoern:
> I have a dictionary and a class. The dictionary needs to be filled with
> multiple instances of the class, with multiple instances per key. Currently
> a lot of the dictionaries that are going into the program are hard coded
> because they're just 1:1 mappings, in this case though it was a many:1
> mapping and so I got a little stumped. I couldn't hard coded the mappings,
> so I then needed to find a way of doing it dynamically. I'm now reading data
> from a file containing the data for the class, and am now able to put that
> data into a dictionary.
>
> I'm quite new to programming large things, and previous experience has only
> been in C and C++, so I'm also trying to get an idea of good programming
> practises.


FWIW, and while there of course are quite a few common rules (consistent
and meaningfull naming, modularization with high cohesion and low
coupling, "don't repeat yourself" etc), "good programming practises"
greatly vary from language to language. In fact, one of the common rules
is probably : "be idiomatic" - that is, don't try to write Pascal in
Lisp (or C in Python...).

> Other people are going to need to use this program, I need it to
> be... correct... should someone need to alter it. So loads of documentation,
> and meaningful variable names, but it's also experience that I'm lacking.


Indeed.

> Is
> there a better way of doing such-and-such, or is it sensible to do it this
> way....?


I second Steven's suggestion to spend some time going thru introductory
material. IMHO, the official Python tutorial (to get the basics - no pun
intended) and then DiveIntoPython (to see the language in action) should
do.

Then you'll find that most people here will be very happy to help you
rewrite your code in the most pythonic way if you kindly ask for help...

> Thank you for your help, all of you.


Welcome to c.l.py.
 
Reply With Quote
 
special_dragonfly
Guest
Posts: n/a
 
      08-09-2007

"Ben Finney" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> "special_dragonfly" <(E-Mail Removed)> writes:
>
>> I've managed to solve the problem, I really was just being a
>> dunce.

>
> Doubtful; but at this stage we can't tell, because we still don't know
> what it is you're actually trying to *do*.
>
>> Here's how incase anyone is wondering:
>>
>> class MyClass:
>> def __init__(self):
>> name=""
>> dict={}
>> dict[0]=[]
>> dict[0].append(MyClass())
>> dict[0][0].name="Hello"
>> print dict[0][0].name

>
> It's not clear why you are using the value 0 for a dictionary key
> here; nor why you're assigning an attribute to an object after
> creating the object. Neither of them are errors, but without context
> it's hard to know what advice to give.
>

The 0 for a key is just an example. The code I actually have would be just
as meaningful at the end of the day. I could have changed MyClass for
class Animals(object):
def __init__(self, name="", type="", age=""):
self.name=name
self.type=type
self.age=age

dict={'Mouse':[Animals('George','long eared',20)]}
dict['Mouse'].append(Animals('Benny','hairy',30))
dict['Cat']=[Animals('Inigo Montoya','spanish',10)]

and Neil, Bruno has the right idea of what I was trying to do. However, your
code came in handy still as I used your code elsewhere.see below.

def EnterDictionary(FieldsDictionary,key,data):
for i in range(0,int(data[6:])):
line=myfile.readline()
line=line.strip()
line=line[6:-1]
if key in FieldsDictionary:
FieldsDictionary[key].append(FieldClass(*line.split(",")))
else:
FieldsDictionary[key]=[FieldClass(*line.split(","))]

I'd like to thank you all for your patience with me whilst I've asked some
really beginner-like questions. I hope I haven't annoyed you all too much...

In future I would ask however, if it's a really stupid question and you feel
that the answer can be found either by searching google (because in some
cases I don't know what to search for), or in one of the O'reilly books,
just say. In either case, if you could refer me to the search term to use or
the book to read I'd be grateful.

Dominic


 
Reply With Quote
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      08-09-2007
Neil Cerutti a écrit :
> On 2007-08-09, Bruno Desthuilliers <(E-Mail Removed) > wrote:
>> Neil Cerutti a écrit :
>>> On 2007-08-09, special_dragonfly <(E-Mail Removed)> wrote:
>>>> Is there anyway for python to consider the values within a
>>>> string when entering the data into a dictionary. I know that
>>>> isn't very clear so here's an example:
>>>>
>>>> class MyClass(object):
>>>> def __init__(self,name="",age=""):
>>>> self.name=name
>>>> self.age=age
>>>>
>>>> data="Gary,50"
>>>> d={0:[MyClass(data)]}
>>>> data="Adam,25"
>>>> d[0].append(MyClass(data))
>>>>
>>>> The data is coming from a text file working on a line by line
>>>> basis. I've just tried and I'm just getting the full string in
>>>> the first field. That seems logical, now I don't want it to
>>>> though!
>>> That's what happens if you use 0 for the key every time.

>> Hmmm... Neil, I may be wrong but I think you didn't get the
>> point here. As I understand it, Dominic's problem is that it
>> gets strings like "Gary,50" and would like to call MyClass
>> initializer this way : MyClass("Gary", "50")

>
> My guess was he doesn't need a class at all,


Mmm... That's possible (and if all he has in MyClass are name and age
data attributes, then you're obviously right). But then your answer was
perhaps a bit confusing (at least it confused me...)

 
Reply With Quote
 
Sion Arrowsmith
Guest
Posts: n/a
 
      08-09-2007
special_dragonfly <(E-Mail Removed)> wrote:
> if key in FieldsDictionary:
> FieldsDictionary[key].append(FieldClass(*line.split(",")))
> else:
> FieldsDictionary[key]=[FieldClass(*line.split(","))]


These four lines can be replaced by:

FieldsDictionary.setdefault(key, []).append(FieldClass(*line.split(",")))

--
\S -- http://www.velocityreviews.com/forums/(E-Mail Removed) -- http://www.chaos.org.uk/~sion/
"Frankly I have no feelings towards penguins one way or the other"
-- Arthur C. Clarke
her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump
 
Reply With Quote
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      08-09-2007
special_dragonfly a écrit :
> "Ben Finney" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
>> "special_dragonfly" <(E-Mail Removed)> writes:
>>
>>> I've managed to solve the problem, I really was just being a
>>> dunce.

>> Doubtful; but at this stage we can't tell, because we still don't know
>> what it is you're actually trying to *do*.
>>
>>> Here's how incase anyone is wondering:
>>>
>>> class MyClass:
>>> def __init__(self):
>>> name=""
>>> dict={}
>>> dict[0]=[]
>>> dict[0].append(MyClass())
>>> dict[0][0].name="Hello"
>>> print dict[0][0].name

>> It's not clear why you are using the value 0 for a dictionary key
>> here; nor why you're assigning an attribute to an object after
>> creating the object. Neither of them are errors, but without context
>> it's hard to know what advice to give.
>>

> The 0 for a key is just an example. The code I actually have would be just
> as meaningful at the end of the day. I could have changed MyClass for
> class Animals(object):
> def __init__(self, name="", type="", age=""):
> self.name=name
> self.type=type
> self.age=age
>
> dict={'Mouse':[Animals('George','long eared',20)]}
> dict['Mouse'].append(Animals('Benny','hairy',30))
> dict['Cat']=[Animals('Inigo Montoya','spanish',10)]
>
> and Neil, Bruno has the right idea of what I was trying to do. However, your
> code came in handy still as I used your code elsewhere.see below.
>
> def EnterDictionary(FieldsDictionary,key,data):
> for i in range(0,int(data[6:])):
> line=myfile.readline()
> line=line.strip()
> line=line[6:-1]
> if key in FieldsDictionary:
> FieldsDictionary[key].append(FieldClass(*line.split(",")))
> else:
> FieldsDictionary[key]=[FieldClass(*line.split(","))]


May I suggest a couple possible improvements ?

First : you're of course free to use any naming convention you like, and
it's obviously better to stay consistent, but the canonical Python
convention is to use all_lower for vars, functions (and methods) and
modules, and MixedCase for classes.

About the code now:

def EnterDictionary(FieldsDictionary,key,data):
for i in range(0,int(data[6:])):

1/ Golden rule : avoid the use of "magic numbers". This one stands true
for any languages !-). The usual solution is to use symbolic constants.
While Python doesn't have real symbolic constant, the convention is to
write them ALL_UPPER.

2/ range() can be used with only one argument, which then will be use as
the upper bound. IOW,
range(0, X)
is the same as
range(X)

line=myfile.readline()

3/ where does this 'myfile' comes from ? (hint : don't use globals when
you can avoid them)


line=line.strip()
line=line[6:-1]

4/ magic numbers again, cf /1. Question : does this 6 has anything to do
with the other one ? What will happen when the file format will change ?

5/ you can do all this in a single line, adding the split() too:
args = myfile.readline().strip()[XXX:-1].split(",")

> if key in FieldsDictionary:
> FieldsDictionary[key].append(FieldClass(*line.split(",")))
> else:
> FieldsDictionary[key]=[FieldClass(*line.split(","))]



If you expect key to most of the times be already in FieldsDictionnary,
then a try/except block might be a bit faster. If you expect key to not
be here most of the times, then your solution is right. Note that you
can also use dict.setdefault(key, default):

# probably bad names but I don't have a clue what they should be
DATA_INDEX_OFFSET = 6
LINE_START = 6
LINE_END = -1

def update_fields_dict(fields_dict, key, data, datafile):
for i in range(int(data[DATA_INDEX_OFFSET:])):
args =datafile.readline().strip()[LINE_START:LINE_END].split(",")
fields_dict.setdefault(key, []).append(FieldClass(*args))

Feel free to take or leave what you consider appropriate here. But by
all means avoid magic numbers, except possibly for Q&D throw-away
scripts (and even then...).

HTH

> In future I would ask however, if it's a really stupid question and you feel
> that the answer can be found either by searching google (because in some
> cases I don't know what to search for), or in one of the O'reilly books,
> just say. In either case, if you could refer me to the search term to use or
> the book to read I'd be grateful.


That's usually what happens then, don't worry.
 
Reply With Quote
 
Alex Martelli
Guest
Posts: n/a
 
      08-11-2007
Sion Arrowsmith <(E-Mail Removed)> wrote:

> special_dragonfly <(E-Mail Removed)> wrote:
> > if key in FieldsDictionary:
> > FieldsDictionary[key].append(FieldClass(*line.split(",")))
> > else:
> > FieldsDictionary[key]=[FieldClass(*line.split(","))]

>
> These four lines can be replaced by:
>
> FieldsDictionary.setdefault(key, []).append(FieldClass(*line.split(",")))


Even better might be to let FieldsDictionary be an instance of
collections.defaultdict(list) [[assuming Python 2.5 is in use]], in
which case the simpler

FieldsDictionary[key].append(FieldClass(*line.split(",")))

will Just Work. setdefault was a valiant attempt at fixing this
problem, but defaultdict is better.


Alex
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
inheritance, multiple inheritance and the weaklist and instance dictionaries Rouslan Korneychuk Python 8 02-10-2011 04:02 AM
updating dictionaries from/to dictionaries Brandon Python 12 08-15-2008 12:35 AM
Pickling dictionaries containing dictionaries: failing,recursion-style! lysdexia Python 6 12-02-2007 12:03 AM
Suggestion requested: Tutorial on Ajax reusable Java GUI Classes chiluvuri1@yahoo.com Java 0 05-13-2006 04:25 AM
Dictionaries -- ahh the fun.. (newbie help) rh0dium Python 5 05-10-2006 08:33 AM



Advertisments