2013-02-24 3 views
1

Мне нужен массив из n элементов, в котором каждый элемент имеет 2 атрибута.Альтернатива двумерному массиву в Python

A.element[0].name="qwe" 
A.element[0].age=23 
A.element[1].name="www" 
A.element[1].age=24 
... 
A.element[n].name="e" 
A.element[n].age=25 

Есть ли другая форма, которая не предусматривает проектирование класса?

ответ

2

Вы можете использовать массив словарей.

Что-то вроде этого:

A = [ 
    {'name': 'qwe', 'age': 23}, 
    {'name': 'www', 'age': 24} 
] 

Вы можете упростить вставки, делая что-то вроде этого:

A = [] 

def addPerson(name, age): 
    global A 
    A.append({'name': name, 'age': age}) 

Или просто сделать словари в массивы, поэтому вам не нужно указывать «имя» и «возраст» в каждой строке. Может быть, проще написать класс, представляющий человека (или что бы то ни было).

+0

мне понравилась, но удалить глобальный! – tdelaney

4

collections.namedtuple.

>>> from collections import namedtuple 
>>> Element = namedtuple('Element', 'name age') 
>>> A.element[0] = Element('qwe', 23) 
>>> print A.element[0].name 
qwe 
>>> print A.element[0].age 
23 

Однако это кортежи, а не списки, и поэтому их нельзя изменить. Кроме того, они по-прежнему по существу являются классами, но вы просто не определяете их с помощью ключевого слова class. См. this для подробного объяснения.

1

Если вы используете NumPy, вы также можете использовать структуру массива:

In [66]: struct = np.dtype([("name", np.object), ("age", np.int)]) 
a = np.array([("abc", 12), ("def", 20), ("xyz", 50)], dtype=struct) 
a[0] 
Out[66]: ('abc', 12) 

In [67]: a[0]["name"] 
Out[67]: 'abc' 

In [68]: a["name"] 
Out[68]: array([abc, def, xyz], dtype=object) 

In [69]: a["age"] 
Out[69]: array([12, 20, 50]) 

In [72]: a["age"][2] 
Out[72]: 50 
Смежные вопросы