Python中字符串列表中的动态变量名称

时间:2014-01-30 23:07:35

标签: python

我来自Matlab,需要在python / numpy中重新实现一些数据处理。我有特定格式的数据文件,但它可以改变文件中列出的变量。

在matlab中,我可以编写函数来将数据数组放在方便的结构中,如下所示:

s = data_to_struct(filename)
s.altitude
s.time
s.latitude
s.longitude
s.density
s.temperature

然后我可以传递给各种绘图或过滤功能。我想在Python中做同样的事情,使用一个对象代替struct。我知道Proper™的方式是使用dict,但对于这个非常具体和有限的情况,dict语法在我眼中更加丑陋: s.temperature vs s ['temperature'] < / strong>,以及更多的打字。从文件中读取一串变量名,然后使用这些名称创建变量或对象成员的最佳方法是什么?

我会做很多交互式绘图和数据处理,我想尽可能简化打字和标签。

4 个答案:

答案 0 :(得分:2)

>>> from collections import namedtuple
>>> Something = namedtuple('Something', 'a b c')
>>> a = Something(1, 2, 4)
>>> a.c
4

namedtuple documentation

如果您已经反序列化了数据并且它存在于具有相同长度的多个元组的集合中,那么这一点尤为方便。

答案 1 :(得分:2)

考虑使用Pandas。它有fast and flexible functions来读取各种文件格式的数据,例如read_table,DataFrame列可以通过属性查找引用:

In [168]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=['foo', 'bar', 'baz'])

In [169]: df
Out[169]: 
   foo  bar  baz
0    0    1    2
1    3    4    5
2    6    7    8
3    9   10   11

[4 rows x 3 columns]

In [170]: df.bar
Out[170]: 
0     1
1     4
2     7
3    10
Name: bar, dtype: int32

答案 2 :(得分:2)

我在namedtuple看到的一个问题是,在实例化之后你无法编辑对象的值,我不知道你是否需要这样做。

虽然它可能有点复杂,但您可以使用setattr创建一个对象,并且基本上创建一个工厂,使用您的自定义属性生成对象。

示例如下:

def data_to_struct(*info):
    class O(object):
        def __init__(self, *args):
            for a in args:
                setattr(self, a, None)
    return O(*info)

然后,使用它,您将传递data_to_struct一个字符串列表,这些字符串将成为您的属性名称,并返回一个将所有这些字符串作为空属性的对象。

>>> g = data_to_struct('a', 'b', 'c')
>>> g.a
>>> g.b = 3
>>> g.b
3

当然,您可以选择使用kwargs或其他内容在实例化时为各种属性提供值。

答案 3 :(得分:0)

您也可以写obj.attr = value而不是setattr(obj, 'attr', value),它将属性名称作为字符串。