在list / array python中打包不同数据类型的多个变量

时间:2013-01-08 08:10:42

标签: python data-structures

我有多个变量需要打包为一个并按顺序保存,就像在数组或列表中一样。这需要在Python中完成,我仍处于Python初期。

E.g。在Python中:

a = Tom
b = 100
c = 3.14
d = {'x':1, 'y':2, 'z':3}

以上所有内容都在一个顺序数据结构中。我可以尝试一下,为了清楚起见,我在C ++中也会做类似的实现。

struct
{ 
string a;
int b;
float c;
map <char,int> d;// just as an example for dictionary in python
} node;

vector <node> v; // looking for something like this which can be iterable

如果有人可以给我一个类似的存储实现,迭代和修改内容将非常有用。正确方向的任何指针对我都很好。

谢谢

3 个答案:

答案 0 :(得分:3)

你可以像Michael建议的那样使用字典(但是你需要使用v来访问v['a']的内容,这有点麻烦),或者你可以使用等效的C ++结构命名元组

import collections

node = collections.namedtuple('node', 'a b c d')

# Tom = ...

v = node(Tom, 100, 3.14, {'x':1, 'y':2, 'z':3})
print node  # node(a=…, b=100, c=3.14, d={'x':1, 'y':2, 'z':3})
print node.c  # 3.14
print node[2]  # 3.14 (works too, but is less meaningful and robust than something like node.last_name)

这类似于,但比定义自己的类更简单:type(v) == node等。但是,请注意,正如volcano指出的那样,namedtuple中存储的值无法更改({{{ 1}}是不可变的。

如果您确实需要修改记录中的值,最佳选择是

namedtuple

最后一个选项,我不推荐,确实要使用列表或元组,就像ATOzTOA提到的那样:元素必须在不是这样的情况下访问 - 可信方式:class node(object): def __init__(self, *arg_list): for (name, arg) in zip('a b c d'.split(), arg_list): setattr(self, name, arg) v = node(1, 20, 300, "Eric") print v.d # "Eric" v.d = "Ajay" # Works 没有node[3]那么有意义;此外,在使用列表或元组时,您无法轻松更改字段的顺序(如果您访问命名元组或自定义类属性,则顺序并不重要)。


多个node.last_name对象通常放在列表中,标准Python结构用于此目的:

node

all_nodes = [node(…), node(…),…]

all_nodes = []
for … in …:
    all_nodes.append(node(…))

等。最好的方法取决于如何创建各种all_nodes = [node(…) for … in …] 对象,但在许多情况下,列表可能是最好的结构。

但请注意,如果您需要存储类似于电子表格表的内容并且需要速度和工具来访问其列,那么使用NumPy的record arrays或类似{{3}的软件包可能会更好}。

答案 1 :(得分:1)

您可以将所有值放在字典中,并列出这些字典。

{'a': a, 'b': b, 'c': c, 'd': d}

否则,如果此数据可以由类表示,例如'Person';创建一个Person类,并使用您的数据创建该类的对象:

http://docs.python.org/2/tutorial/classes.html

答案 2 :(得分:1)

只需使用列表:

a = "Tom"
b = 100
c = 3.14
d = {'x':1, 'y':2, 'z':3}

data = [a, b, c, d]

print data
for item in data:
    print item

输出:

['Tom', 100, 3.14, {'y': 2, 'x': 1, 'z': 3}]
Tom
100
3.14
{'y': 2, 'x': 1, 'z': 3}