2012-08-05 2 views
1

Я хочу, чтобы моя функция возвращала несколько словарей на основе вызывающих аргументов. например если я вызываю функцию без аргумента, она должна возвращать все словари else, если я вызываю ее со списком аргументов, она должна возвращать соответствующие словари из этой функции. По-видимому, если я звоню без аргументов или одного arg, он работает нормально, но у меня проблема с использованием его с несколькими значениями. Следующий пример показывает эту проблему.Возвращение нескольких словарей из функции python на основе вызывающего аргумента

def mydef(arg1=None): 
    a = {'a1':1, 'a2':2} 
    b = {'b1':1, 'b2':2} 
    c = {'c1':1, 'c2':2} 
    d = {'d1':1, 'd2':2} 
    if arg1 is None: 
     return a,b,c,d 
    else: 
     for x in arg1: 
      if x == 'a': 
       return a 
      elif x == 'b': 
       return b 

w,x,y,z = mydef() 
print type(w) 
print w 

s,t = mydef(['a', 'b']) 
print type(s) 
print s 
print type(t) 
print t 

Сомнение: Списки возвращаются вместо dicts:

def mydef(args=None): 
    dicts = { 'a' :{'a1' : 1, 'a2' :2}, 'b' : {'b1' : 1, 'b2' :2}} 
    if args is None: 
     args = ['a', 'b'] 
    return [dicts[d] for d in args] 


x,y = mydef() 
type(x) 
>> type 'dict' 

type(y) 
>> type 'dict' 

x = mydef(['a']) 
type(x) 
>> type 'list' 

ответ

11

Функция получает только вернуть один раз. Вы не можете зацикливаться и пытаться вернуть что-то на каждой итерации цикла; первый возвращает и заканчивает функцию. Если вы хотите «вернуть несколько значений», то вам действительно нужно вернуть одно значение, содержащее их все, например список значений или кортеж значений.

Кроме того, было бы лучше поместить словари в словарь (sup dawg) вместо использования локальных переменных, чтобы назвать их. Затем вы можете просто выбрать их ключом.

Вот способ сделать это, который возвращает список выбранных dicts:

>>> def returnDicts(args=None): 
...  dicts = { 
...   'a': {'a1':1, 'a2':2}, 
...   'b': {'b1':1, 'b2':2}, 
...   'c': {'c1':1, 'c2':2}, 
...   'd': {'d1':1, 'd2':2} 
...  } 
...  if args is None: 
...   args = ['a', 'b', 'c', 'd'] 
...  return [dicts[d] for d in args] 
>>> returnDicts() 
[{'a1': 1, 'a2': 2}, 
{'b1': 1, 'b2': 2}, 
{'c1': 1, 'c2': 2}, 
{'d1': 1, 'd2': 2}] 
>>> returnDicts(['a']) 
[{'a1': 1, 'a2': 2}] 
>>> returnDicts(['a', 'b']) 
[{'a1': 1, 'a2': 2}, {'b1': 1, 'b2': 2}] 
+2

+1 для "sup dawg". – Blender

+0

Незначительный nitpick: я бы написал 'args = dicts.keys()', так что ваша функция будет работать так, как если бы вы добавили больше словарей –

+0

lol @ dog comment. – klobucar

0

почему бы не сделать их dicts из dicts как так

def mydicts(arg1=None): 
    dicter = {'a': {'a1':1, 'a2':2}, 
       'b': {'b1':1, 'b2':2}, 
       'c': {'c1':1, 'c2':2}, 
       'd': {'d1':1, 'd2':2}, 
       } 

    #if arg1 is None return all the dictionaries. 
    if arg1 is None: 
     arg1 = ['a', 'b', 'c', 'd'] 

    # Check if arg1 is a list and if not make it one 
    # Example you pass it a str or int 

    if not isinstance(arg1, list): 
     arg1 = [arg1] 

    return [dicter.get(x, {}) for x in arg1] 

Примечание, это также будет возвращать список предметов обратно к вам.

+0

Я пробовал ваше решение, здесь, когда я передаю выражения, тогда возвращаемое значение - это список, а не словарь. Кроме того, возвращенный список также содержит только ключи, поэтому явное преобразование также не поможет – sarbjit

+0

Я исправил синтаксическую ошибку, и, если вы прочтете ее, «Примечание, это также вернет вам список элементов». Я вижу полный dicts, когда я запускаю это, а не только ключи. В [8]: mydicts() Out [8]: [{'a1': 1, 'a2': 2}, {'b1': 1, 'b2': 2}, {'c1 ': 1,' c2 ': 2}, {' d1 ': 1,' d2 ': 2} ] – klobucar

+0

Я попытался с вашим отредактированным кодом, он все еще возвращает списки при передаче аргумента. Пожалуйста, ознакомьтесь с моими изменениями в оригинальном вопросе, показывающем, как я его использую. Я использовал его как это, но просто использовал его, как описано в моем редактировании. – sarbjit

Смежные вопросы