选择数量不断变化的变量以在 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'

并且我想编写一个函数来创建一个仅包含上述多个变量的字典,例如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'}.

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

在此先感谢大家提出意见或建议。

首先你有一个包含所有需要的 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 异常。