选择不断变化的变量数以在Python

时间:2015-05-13 14:29:56

标签: python database function dictionary args

我有以下变量

city     = 'Chicago'
country  = 'USA'
state    = 'Illinois' 
dates    = ['1/1/2013', '1/1/2014', '1/1/2015']
var1     = [4.5, 6.5, 7]
lake     = 'Michigan'

我想编写一个函数来创建一个只包含许多上述变量的字典,例如: citystatedatesvar1,此数字应随意更改。

让我们考虑下面的例子来澄清我的想法。

我定义了这个函数:

def funct(**args)
    return args

这样,如果我随意选择

funct(city = 'Chicago', lake = 'Michigan', var1 = [4.5, 6.5, 7])

我得到了

{'city': 'Chicago', 'lake': 'Michigan', 'var1': [4.5, 6.5, 7]}.

问题是我想避免每次在参数中写city = 'Chicago', lake = 'Michigan', var1 = [4.5, 6.5, 7],实际上我宁愿先设置一个长变量列表然后构建一个自定义字典,只调用我喜欢的对象,例如

newfunct(city, state, country)

获取输出

{'city': 'Chicago', 'state': 'Illinois', 'country': 'USA'}

newfunct(lake, city)

获取字典

{'lake': 'Michigan', 'city': 'Chicago'}.

我希望我已经清楚地解释了我的问题。

提前感谢大家提供意见或建议。

2 个答案:

答案 0 :(得分:2)

在我看来,如果你必须这样做,你的代码将被更改为更加pythonic的方法,但既然你问,这是我的解决方案:

city = 'Chicago'
country = 'USA'
state = 'Illinois'
dates = ['1/1/2013', '1/1/2014', '1/1/2015']
var1 = [4.5, 6.5, 7]
lake = 'Michigan'

def newfunct_by_val(*args):
    return {k:v for k, v in globals().iteritems() for i in args if v == i}

def newfunct_by_name(*args):
    return {i: globals()[i] for i in args}

print newfunct_by_val(city, state, country)
print newfunct_by_name('city', 'state', 'country')

输出:

{'city': 'Chicago', 'state': 'Illinois', 'country': 'USA'}
{'city': 'Chicago', 'state': 'Illinois', 'country': 'USA'}

根据我的理解,你需要一个函数,它将变量名作为参数,你不想定义其他字典等。

如果这确实是您所需要的,那么newfunct_by_val功能就是您的解决方案。此函数在globals()字典中搜索所有变量(更确切地说是:keys),其值等于作为参数传递的变量的值。它有一个缺点:如果多个全局变量具有相同的值,那么它将生成一个包含所有变量的字典。这就是为什么我不推荐这个解决方案。

如果您同意使用全局变量的名称作为字符串调用函数,那么newfunct_by_name就可以了。

请注意,如果一个或多个参数不是变量名称,则这两个函数可能会失败。例如:打印newfunct_by_val(zipcode)newfunct_by_name('zipcode')。在这种情况下,他们将提出KeyError例外。

答案 1 :(得分:0)

首先,你需要包含所有key:value对的字典,现在你创建一个函数newfunc()并迭代它的参数以从给定的字典中检索它的值,然后再次压缩结果创建字典。

d = {"city" : 'Chicago', "country"  : 'USA', "state" : 'Illinois', "dates" : ['1/1/2013', '1/1/2014', '1/1/2015'], "var1" :[4.5, 6.5, 7], "lake" : 'Michigan'}

def newfunc(*args):
    return {i: d.get(i, None) for i in args}

print newfunc("city", "country")

输出:

{'city': 'Chicago', 'country': 'USA'}