Greetings Tutors, I am having some difficulties with the concept of functions which can accept an unnamed number of arguments. Specifically, when trying to write a function that deals with an unnamed number of dictionaries. I want to be able to merge any number of dictionaries, while preserving the values (ie. cannot use update()).
~I would appreciate any help that can point in me in the right direction, without directly providing me the answer.~ I understand how to accomplish this task with named arguments: def mergedicts(firstdict, seconddict): '''merges two dictionaries into a single dictionary, and converts duplicate key values to a list''' newdict = firstdict.copy() for key in seconddict.keys(): if key in firstdict.keys(): newdict[key] = firstdict[key], seconddict[key] newdict[key] = list(newdict[key]) else: newdict[key] = seconddict[key] return newdict dict1 = {'1':'a','2':'b','3':'c'} dict2 = {'4':'d','5':'e','6':'f','1':'g'} somedicts1 = mergedicts(dict1,dict2) print somedicts1 #returns: {'1': ['a', 'g'], '3': 'c', '2': 'b', '5': 'e', '4': 'd', '6': 'f'} I also think I understand how to use unnamed arguments to merge lists: def mergelists(*somelists): '''merges multiple lists into a single list and consolidates lists elements''' mergedict = {} for element in somelists: for unique in element: mergedict[unique] = 1 combolist = mergedict.keys() return combolist Where I am getting hung up is that, if I do this with unnamed arguments for dictionaries: def mergedicts(*somedicts): I get an: AttributeError: 'tuple' object has no attribute 'keys' However, I run into the same problem when trying with one named, and unnamed. def mergedicts2(firstdict,*somedicts): '''merges any number of dictionaries into a single dictionary, and converts duplicate key values to a list''' merged = firstdict.copy() for key in somedicts.keys(): if key in merged.keys(): merged[key] = merged[key], somedicts[key] merged[key] = list(merged[key]) else: merged[key] = somedicts[key] return merged Based on my understanding of how unnamed arguments work in functions: I think the dictionaries are being converted into a tuple of all of the dictionary values, and I cannot make a working copy of the first dictionary passed to the function, with the named example. Should I then unpack the resulting tuple into corresponding first,second,third... dictionaries for further processing? I am also wondering if this is even the right approach? Can this be done with only unnamed arguments, or do I at least need to name the first argument for the first reference dictionary, and then use an *unnamed for each additional dictionary? Thanks for any pointers, Colin -- "f u cn rd ths, u cn gt a gd jb n cmptr prgrmmng." - Anonymous _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor