按dict名称从不同的dict获取信息



我有一个数据/character_data.py:

CHARACTER_A = { 1: {"level": 1, "name":"Ann", "skill_level" : 1},
                2: {"level": 2, "name":"Tom", "skill_level" : 1}}
CHARACTER_B = { 1: {"level": 1, "name":"Kai", "skill_level" : 1},
                2: {"level": 2, "name":"Mel", "skill_level" : 1}}

在main.py中,我可以这样做:

from data import character_data as character_data
print character_data.CHARACTER_A[1]["name"]
>>> output: Ann
print character_data.CHARACTER_B[2]["name"]
>>> output: Mel

我该如何做到这一点?

from data import character_data as character_data
character_type = "CHARACTER_A"
character_id = 1
print character_data.character_type[character_id]["name"]
>>> correct output should be: Ann

当尝试将character_type用作"character_A"时,我会得到AttributeError。

这个怎么样

In [38]: from data import character_data as character_data
In [39]: character_type = "CHARACTER_A"
In [40]: character_id = 1
In [41]: getattr(character_data, character_type)[character_id]["name"]
Out[41]: 'Ann'

您可以使用locals():

>>> from data.character_data import CHARACTER_A, CHARACTER_B
>>> character_id = 1
>>> character_type = "CHARACTER_A"
>>> locals()[character_type][character_id]["name"]
Ann

不过,请考虑将CHARACTER_ACHARACTER_B合并为一个dict,并访问该dict而不是locals()

另请参阅深入Python:局部和全局。

您需要正确地构建数据结构。

characters = {}
characters['type_a'] = {1: {"level": 1, "name":"Ann", "skill_level" : 1},
                2: {"level": 2, "name":"Tom", "skill_level" : 1}}
characters['type_b'] = ...

或者,更好的解决方案是创建自己的"字符"类型,并使用它:

class Character(object):
    def __init__(self, type, level, name, skill):
        self.type = type
        self.level = level
        self.name = name
        self.skill = skill
characters = []
characters.append(Character('A',1,'Ann',1))
characters.append(Character('A',2,'Tom',1))
characters.append(Character('B',2,'Kai',1)) # and so on

然后,

all_type_a = []
looking_for = 'A'
for i in characters:
   if i.type == looking_for:
      all_type_a.append(i)

或者,更短的方式:

all_type_a = [i for i in characters if i.type == looking_for]

最新更新