字典键作为字典
Dictionary keys as dictionary
问题
如何使用字典的键作为字典名,使用之前的名字作为键?
这里有一个类似的问题:
目前只找到这个Python bidirectional mapping,涵盖了双向映射的基本功能
虽然我不想找到值的键,但是像这样:
dict_one = { 'a': 123, 'b': 234 }
dict_two = { 'a': 567, 'b': 678 }
dict_one['a']
>> 123
dict_two['a']
>> 567
#... some magic (not simply defining a dict called 'a' though)
a['dict_one']
>> 123
a['dict_two']
>> 567
情况
我有许多字典存储不同对象的常量。每个对象都具有相同的属性(或者大多数对象都存在)。为了简化循环中常量的调用,两种描述的方法都是有用的。
你不应该使用以下解决方案,它修改了globals()(这种环境操作是错误的-俯卧,应尽可能避免!):
dict_one = { 'a': 123, 'b': 234 }
dict_two = { 'a': 567, 'b': 678 }
output = {}
for x in dict_one.keys():
submap = output.get(x, {})
submap["dict_one"] = dict_one[x]
output[x] = submap
for x in dict_two.keys():
submap = output.get(x, {})
submap["dict_two"] = dict_two[x]
output[x] = submap
# part 2
globs = globals()
for x in output:
globs[x] = output[x]
print a['dict_two'] # 567
你应该做的,只是简单地使用output
作为抽象层(忽略前面代码片段的"part 2",而是使用):
print output['a']['dict_one'] #123
您可以定义自己的class继承自dict
来实现这一点,并覆盖__getitem__
方法。但是这个解决方案也通过 globals
字典添加变量,而不是我之前其他人提到的推荐做法。
class mdict(dict):
def __getitem__(self, item):
self.normal = dict(self)
return self.normal[str(globals()[item])]
dict_one = {'a': 123, 'b': 234}
dict_two = {'a': 567, 'b': 678}
lst = [dict_one, dict_two]
for item in lst:
for k, v in item.iteritems():
dd = globals().setdefault(k, mdict())
dd[str(item)] = v
>>> print a['dict_one']
123
>>> print b['dict_one']
234
>>> print a['dict_two']
567
>>> print b['dict_two']
678
问题
如何使用字典的键作为字典名,使用之前的名字作为键?
这里有一个类似的问题:
目前只找到这个Python bidirectional mapping,涵盖了双向映射的基本功能
虽然我不想找到值的键,但是像这样:
dict_one = { 'a': 123, 'b': 234 }
dict_two = { 'a': 567, 'b': 678 }
dict_one['a']
>> 123
dict_two['a']
>> 567
#... some magic (not simply defining a dict called 'a' though)
a['dict_one']
>> 123
a['dict_two']
>> 567
情况
我有许多字典存储不同对象的常量。每个对象都具有相同的属性(或者大多数对象都存在)。为了简化循环中常量的调用,两种描述的方法都是有用的。
你不应该使用以下解决方案,它修改了globals()(这种环境操作是错误的-俯卧,应尽可能避免!):
dict_one = { 'a': 123, 'b': 234 }
dict_two = { 'a': 567, 'b': 678 }
output = {}
for x in dict_one.keys():
submap = output.get(x, {})
submap["dict_one"] = dict_one[x]
output[x] = submap
for x in dict_two.keys():
submap = output.get(x, {})
submap["dict_two"] = dict_two[x]
output[x] = submap
# part 2
globs = globals()
for x in output:
globs[x] = output[x]
print a['dict_two'] # 567
你应该做的,只是简单地使用output
作为抽象层(忽略前面代码片段的"part 2",而是使用):
print output['a']['dict_one'] #123
您可以定义自己的class继承自dict
来实现这一点,并覆盖__getitem__
方法。但是这个解决方案也通过 globals
字典添加变量,而不是我之前其他人提到的推荐做法。
class mdict(dict):
def __getitem__(self, item):
self.normal = dict(self)
return self.normal[str(globals()[item])]
dict_one = {'a': 123, 'b': 234}
dict_two = {'a': 567, 'b': 678}
lst = [dict_one, dict_two]
for item in lst:
for k, v in item.iteritems():
dd = globals().setdefault(k, mdict())
dd[str(item)] = v
>>> print a['dict_one']
123
>>> print b['dict_one']
234
>>> print a['dict_two']
567
>>> print b['dict_two']
678