我有以下变量
city = 'Chicago'
country = 'USA'
state = 'Illinois'
dates = ['1/1/2013', '1/1/2014', '1/1/2015']
var1 = [4.5, 6.5, 7]
lake = 'Michigan'
我想编写一个函数来创建一个只包含许多上述变量的字典,例如: city
,state
,dates
和var1
,此数字应随意更改。
让我们考虑下面的例子来澄清我的想法。
我定义了这个函数:
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'}.
我希望我已经清楚地解释了我的问题。
提前感谢大家提供意见或建议。
答案 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'}