Vogelsire
Vogelsire

Reputation: 189

Get information from different dict by dict name

I have a data/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}}

In main.py, I can do this:

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

How do I achieve this?

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

I get AttributeError when try use character_type as "CHARACTER_A".

Upvotes: 1

Views: 133

Answers (3)

Burhan Khalid
Burhan Khalid

Reputation: 174622

You need to structure your data properly.

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

Or, the better solution is to create your own "character" type, and use that instead:

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

Then,

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

Or, the shorter way:

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

Upvotes: 1

user710907
user710907

Reputation: 772

How about this

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'

Upvotes: 2

alecxe
alecxe

Reputation: 473903

You can use locals():

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

Though, think about merging CHARACTER_A and CHARACTER_B into one dict and access this dict instead of locals().

Also, see Dive into Python: locals and globals.

Upvotes: 2

Related Questions