1

I am not sure if this thing has a name, so I couldn't find any information online so far, although surely there is!

Imagine my MWE:

def PlotElementsDict(dictionary1, dictionary2, itemToPlot, title):
    # dictionary 1 and dictionary 2 are collections.OrderedDict with 'key':[1,2,3]
    # i.e. there values of the keys are lists of numbers
    list1 = [dictionary1[key][itemToPlot] for key in dictionary1.keys()]
    list2 = [dictoinary2[key][itemToPlot] for key in dictionary2.keys()]
    plt.plot(list1, label='l1, {}'.format(itemToPlot)
    plt.plot(list2, label = 'l2, {}'.format(itemToPLot')
    plt.legend()
    plt.title(title)
    return plt.show()

How can I create a function (but my question is even more general, I would like to be able to do this for a class as well) which takes a variable number of parameters of a certain type (for example n dictionaries) plus other parameters which you need only one? (for instance item to plot or could be title)?

In practice I would like to create a function (in my MWE) that no matter how many dictionaries I feed into the function, it manages to plot the given items of that dictionary given a common title and item to plot

Euler_Salter
  • 3,271
  • 8
  • 33
  • 74
  • 1
    Use a list of dictionaries, and loop through the list. – Tom Wyllie Jul 19 '17 at 13:36
  • 2
    Possible duplicate of [Can a variable number of arguments be passed to a function?](https://stackoverflow.com/questions/919680/can-a-variable-number-of-arguments-be-passed-to-a-function) – Błotosmętek Jul 19 '17 at 13:36
  • This post also have a good explanation https://stackoverflow.com/questions/1769403/understanding-kwargs-in-python – Hamuel Jul 19 '17 at 13:36
  • You can also use optional/named parameters/arguments, and check to see if the params have the default values after entry to the function, or if the user has entered in other values. http://www.diveintopython.net/power_of_introspection/optional_arguments.html – silassales Jul 19 '17 at 13:42

1 Answers1

2

Solution with asterisk (*)

This would be a perfect case for pythons asterisk argument style, like so:

def PlotElementsDict(itemToPlot, title, *dictionaries):
    for i, dct in enumerate(dictionaries):
        lst = [dct[key][itemToPlot] for key in dct]
        plt.plot(lst, label='l{}, {}'.format(i, itemToPlot))

    plt.legend()
    plt.title(title)
    plt.show()

Example use case:

dct1 = {'key' : [1,2,3]}
dct2 = {'key' : [1,2,3]}
dct3 = {'key' : [1,2,3]}

title = 'title'

itemToPlot = 2

PlotElementsDict(itemToPlot, title, dct1, dct2, dct3)

Arguments in front

If you want the dictionaries to come first, the other arguments have to be keyword only:

def PlotElementsDict(*dictionaries, itemToPlot, title):
    pass

And call it with explicit argument names

PlotElementsDict(dct1, dct2, dct3, itemToPlot=itemToPlot, title=title)
Jonas Adler
  • 10,365
  • 5
  • 46
  • 73