Help with Dictionaries and Classes requested please.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Neil Cerutti

    #16
    Re: Help with Dictionaries and Classes requested please.

    On 2007-08-09, special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
    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,n ame="",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. ;)

    If you're trying to map between ages and lists of names, then
    you'll want a little helper function to manage the lists for you.

    multidict_add(m dict, key, value):
    if key in mdict:
    mdict[key].append(value)
    else:
    mdict[key] = [value]

    d = {}
    multidict_add(d , 50, "Gary")
    multidict_add(d , 50, "Guido")
    multidict_add(d , 25, "Adam")

    Now you'll get a list of names for every age.
    >>d[50]
    ["Gary", "Guido"]

    You can use the same function to build a mapping from names to
    lists of ages.

    d = {}
    multidict_add(d , "Gary", 50)
    multidict_add(d , "Gary", 23)
    multidict_add(d , "Adam", 25)
    >>d["Gary"]
    [50, 23]

    --
    Neil Cerutti
    The choir invites any member of the congregation who enjoys sinning to join
    the choir. --Church Bulletin Blooper

    Comment

    • Ben Finney

      #17
      Re: Help with Dictionaries and Classes requested please.

      "special_dragon fly" <Dominic@PLEASE ASK.co.ukwrites :
      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.

      --
      \ "When we call others dogmatic, what we really object to is |
      `\ their holding dogmas that are different from our own." -- |
      _o__) Charles Issawi |
      Ben Finney

      Comment

      • Bruno Desthuilliers

        #18
        Re: Help with Dictionaries and Classes requested please.

        Neil Cerutti a écrit :
        On 2007-08-09, special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
        >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,n ame="",age=""):
        > self.name=name
        > self.age=age
        >>
        >data="Gary,5 0"
        >d={0:[MyClass(data)]}
        >data="Adam,2 5"
        >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")

        Comment

        • Neil Cerutti

          #19
          Re: Help with Dictionaries and Classes requested please.

          On 2007-08-09, Bruno Desthuilliers <bruno.42.desth uilliers@wtf.we bsiteburo.oops. comwrote:
          Neil Cerutti a écrit :
          >On 2007-08-09, special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
          >>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,n ame="",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

          Comment

          • special_dragonfly

            #20
            Re: Help with Dictionaries and Classes requested please.


            "Ben Finney" <bignose+hate s-spam@benfinney. id.auwrote in message
            news:87ejic6dkw .fsf@benfinney. id.au...
            "special_dragon fly" <Dominic@PLEASE ASK.co.ukwrites :
            >
            >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','spani sh',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 (FieldsDictiona ry,key,data):
            for i in range(0,int(dat a[6:])):
            line=myfile.rea dline()
            line=line.strip ()
            line=line[6:-1]
            if key in FieldsDictionar y:
            FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))
            else:
            FieldsDictionar y[key]=[FieldClass(*lin e.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


            Comment

            • Bruno Desthuilliers

              #21
              Re: Help with Dictionaries and Classes requested please.

              Neil Cerutti a écrit :
              On 2007-08-09, Bruno Desthuilliers <bruno.42.desth uilliers@wtf.we bsiteburo.oops. comwrote:
              >Neil Cerutti a écrit :
              >>On 2007-08-09, special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
              >>>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,n ame="",age=""):
              >>> self.name=name
              >>> self.age=age
              >>>>
              >>>data="Gary,5 0"
              >>>d={0:[MyClass(data)]}
              >>>data="Adam,2 5"
              >>>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...)

              Comment

              • Sion Arrowsmith

                #22
                Re: Help with Dictionaries and Classes requested please.

                special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
                if key in FieldsDictionar y:
                FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))
                else:
                FieldsDictionar y[key]=[FieldClass(*lin e.split(","))]
                These four lines can be replaced by:

                FieldsDictionar y.setdefault(ke y, []).append(FieldC lass(*line.spli t(",")))

                --
                \S -- siona@chiark.gr eenend.org.uk -- 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

                Comment

                • Bruno Desthuilliers

                  #23
                  Re: Help with Dictionaries and Classes requested please.

                  special_dragonf ly a écrit :
                  "Ben Finney" <bignose+hate s-spam@benfinney. id.auwrote in message
                  news:87ejic6dkw .fsf@benfinney. id.au...
                  >"special_drago nfly" <Dominic@PLEASE ASK.co.ukwrites :
                  >>
                  >>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','spani sh',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 (FieldsDictiona ry,key,data):
                  for i in range(0,int(dat a[6:])):
                  line=myfile.rea dline()
                  line=line.strip ()
                  line=line[6:-1]
                  if key in FieldsDictionar y:
                  FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))
                  else:
                  FieldsDictionar y[key]=[FieldClass(*lin e.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 (FieldsDictiona ry,key,data):
                  for i in range(0,int(dat a[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.rea dline()

                  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 FieldsDictionar y:
                  FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))
                  else:
                  FieldsDictionar y[key]=[FieldClass(*lin e.split(","))]

                  If you expect key to most of the times be already in FieldsDictionna ry,
                  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_OFFS ET = 6
                  LINE_START = 6
                  LINE_END = -1

                  def update_fields_d ict(fields_dict , key, data, datafile):
                  for i in range(int(data[DATA_INDEX_OFFS ET:])):
                  args =datafile.readl ine().strip()[LINE_START:LINE _END].split(",")
                  fields_dict.set default(key, []).append(FieldC lass(*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.

                  Comment

                  • Alex Martelli

                    #24
                    Re: Help with Dictionaries and Classes requested please.

                    Sion Arrowsmith <siona@chiark.g reenend.org.ukw rote:
                    special_dragonf ly <Dominic@PLEASE ASK.co.ukwrote:
                    if key in FieldsDictionar y:
                    FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))
                    else:
                    FieldsDictionar y[key]=[FieldClass(*lin e.split(","))]
                    >
                    These four lines can be replaced by:
                    >
                    FieldsDictionar y.setdefault(ke y, []).append(FieldC lass(*line.spli t(",")))
                    Even better might be to let FieldsDictionar y be an instance of
                    collections.def aultdict(list) [[assuming Python 2.5 is in use]], in
                    which case the simpler

                    FieldsDictionar y[key].append(FieldCl ass(*line.split (",")))

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


                    Alex

                    Comment

                    Working...