On 31/03/2021 19.24, Loris Bennett wrote: > dn <pythonl...@danceswithmice.info> writes: > >> On 31/03/2021 01.22, Loris Bennett wrote: >>> Jon Ribbens <jon+use...@unequivocal.eu> writes: >>>> On 2021-03-30, Loris Bennett <loris.benn...@fu-berlin.de> wrote: >>>>> If I have dict of dicts, say >>>>> >>>>> dod = { >>>>> "alice": >>>>> { >>>>> "lang": "python", >>>>> "level": "expert" >>>>> }, >>>>> "bob": >>>>> { >>>>> "lang": "perl", >>>>> "level": "noob" >>>>> } >>>>> } >>>>> >>>>> is there a canonical, or more pythonic, way of converting the outer key >>>>> to a value to get a list of dicts, e.g >> ... >> >>>>> >>>>> than just >>>>> >>>>> lod = [] >>>>> for name in dod: >>>>> d = dod[name] >>>>> d["name"] = name >>>>> lod.append(d) >> >> >> Please be aware of the 'law of unintended consequences' - what >> functional programmers call "side-effects"! >> >> At the end of the above code, not only has "lod" been created (per spec) >> but "dod" is no longer what it once was. >> >> Thus, future code may not rely upon the (above) structure. Of course, if >> by "convert" you mean transform, ie that "dod" will be del()[eted] >> afterwards, such may be completely unimportant. >> >> >> from pprint import pprint as pp >> import copy >> >> dod = { >> "alice": >> { >> "lang": "python", >> "level": "expert" >> }, >> "bob": >> { >> "lang": "perl", >> "level": "noob" >> } >> } >> >> original = copy.deepcopy( dod ) >> lod = [] >> for name in dod: >> d = dod[name] >> d["name"] = name >> lod.append(d) >> >> print( original == dod ) >> pp(dod) >> pp(original) >> >> >> False >> {'alice': {'lang': 'python', 'level': 'expert', 'name': 'alice'}, >> 'bob': {'lang': 'perl', 'level': 'noob', 'name': 'bob'}} >> {'alice': {'lang': 'python', 'level': 'expert'}, >> 'bob': {'lang': 'perl', 'level': 'noob'}} > > Thanks for pointing that out. Coming from Perl that's something I need > to watch out for. So if I do > > $ a = ["alice", "bob", "carol"] > $ b = a > $ b[1] = "bert" > $ b > ['alice', 'bert', 'carol'] > $ a > ['alice', 'bert', 'carol'] > > I see that changing one list changes the other because 'a' and 'b' are > just bindings to the same object. However, If I look at non-list > variables: > > $ a = "bob" > $ b = a > $ b = "bert" > $ a > 'bob' > > that doesn't happen. What's the rational for that and where can I find > it in the Python documentation?
Good observation! Important to differences. Python offers mutable (can be changed) and immutable (can't) objects (remember: 'everything is an object'): https://docs.python.org/3/reference/datamodel.html?highlight=mutable%20data PS this even applies when the two identifiers pointing at the same object are argument(s) to a function! -- Regards, =dn -- https://mail.python.org/mailman/listinfo/python-list