1

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

例如在 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

如果有人能给我一个类似的存储、迭代和修改内容的实现,那将非常有帮助。任何朝着正确方向的指示对我也有好处。

谢谢

4

3 回答 3

3

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

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等更简单。但是请注意,正如火山所指出的,存储在 a 中的值namedtuple不能更改(anamedtuple是不可变的)。

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

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

我不推荐的最后一个选项确实是使用列表或元组,就像 ATOzTOA 提到的那样:元素必须以不那么易读的方式访问:node[3]node.last_name;没有意义。此外,在使用列表或元组时,您无法轻松更改字段的顺序(而如果您访问命名元组或自定义类属性,则顺序无关紧要)。


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

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

或者

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

或者

all_nodes = [node(…) for … in …]

等等。最好的方法取决于如何node创建各种对象,但在许多情况下,列表可能是最好的结构。

但是请注意,如果您需要存储类似于电子表格的内容并且需要访问其列的速度和设施,那么使用 NumPy 的记录数组Pandas之类的包可能会更好。

于 2013-01-08T08:27:33.673 回答
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}
于 2013-01-08T08:28:40.467 回答
1

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

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

否则,如果此数据是可以由类表示的东西,例如“人”;创建一个 Person 类型的类,并使用您的数据创建该类的对象:

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

于 2013-01-08T08:24:33.830 回答