选择数量不断变化的变量以在 Python 中设置字典
Selecting a changing number of variables to set up a dictionary in Python
我有以下变量
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'}.
我希望我已经清楚地解释了我的问题。
在此先感谢大家提出意见或建议。
首先你有一个包含所有需要的 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'}
在我看来,如果你必须这样做,你的代码应该被更改为更 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() 字典中搜索所有变量(更准确地说:键),其值等于作为参数传递的变量的值。它有一个缺点:如果多个全局变量具有相同的值,那么它将生成一个包含所有这些变量的字典。这就是我不推荐此解决方案的原因。
如果您同意使用全局变量的名称作为字符串调用函数,那么 newfunct_by_name
就可以了。
请注意,如果一个或多个参数不是 变量 名称,则这两个函数都可能失败。例如:打印 newfunct_by_val(zipcode)
或 newfunct_by_name('zipcode')
。在这种情况下,他们将引发 KeyError
异常。
我有以下变量
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'}.
我希望我已经清楚地解释了我的问题。
在此先感谢大家提出意见或建议。
首先你有一个包含所有需要的 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'}
在我看来,如果你必须这样做,你的代码应该被更改为更 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() 字典中搜索所有变量(更准确地说:键),其值等于作为参数传递的变量的值。它有一个缺点:如果多个全局变量具有相同的值,那么它将生成一个包含所有这些变量的字典。这就是我不推荐此解决方案的原因。
如果您同意使用全局变量的名称作为字符串调用函数,那么 newfunct_by_name
就可以了。
请注意,如果一个或多个参数不是 变量 名称,则这两个函数都可能失败。例如:打印 newfunct_by_val(zipcode)
或 newfunct_by_name('zipcode')
。在这种情况下,他们将引发 KeyError
异常。