根据调用参数从python函数返回多个字典
我希望我的函数根据调用参数返回多个字典。例如如果我调用没有参数的函数,它应该返回所有的字典,如果我用参数列表调用它,它应该从函数返回相应的字典。显然,如果我打电话没有参数或一个参数,它工作正常,但我有多个值使用它的问题。以下示例显示了此问题。根据调用参数从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
怀疑:列表返回,而不是类型的字典:
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'
函数只到达返回一次。您无法循环并尝试在循环的每次迭代中返回一些内容;第一个返回并结束该功能。如果你想“返回多个值”,你真正必须做的是返回一个包含它们的值,比如值的列表或者元组的值。
此外,最好将字典放在字典中(sup dawg),而不是使用局部变量来命名它们。然后你可以用钥匙把它们挑出来。
这里做的是返回所选类型的字典列表的方式:
>>> 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}]
为什么不把它们类型的字典的类型的字典,像这样
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]
注意,这也将返回一个列表的项目回给你。
我试过你的解决方案,在这里当我传递参数,然后返回的值是列表而不是字典。此外,返回的列表中也只包含密钥,因此显式转换也不会帮助 – sarbjit 2012-08-18 15:24:52
我修复了一个语法错误,并且如果您阅读它,说“注意,这也会返回一个项目列表给您。”当我运行这个程序时,我看到完整的字符串,而不仅仅是键。 {[b1':1,'b2':2}, {'c1':1,'a2':2} ':1,'c2':2}, {'d1':1,'d2':2} ] – klobucar 2012-08-23 05:57:10
我试着用你编辑过的代码,当arg通过时仍然返回列表。请在原始问题中查看我的编辑,以显示我如何使用它。我用你的,因为它只是用我的编辑描述。 – sarbjit 2012-08-23 15:09:33
+1“sup dawg”。 – Blender 2012-08-05 07:30:25
Minor nitpick:我会写'args = dicts.keys()',这样你的函数就可以按原样工作,如果你添加更多字典 – 2012-08-05 07:35:47
lol @ dog评论。 – klobucar 2012-08-05 07:44:40