0

所以我有这个类叫做Data 并且这个类有两个属性;var_names是否可以将列表的units 列表元素(属于属性units)附加到列表中的每个元素上var_names?因此,当我创建一个名为 的新对象时myData,可能会出现以下输出(因此子列表[1,2,3,4]将与id元素相关联?

>>> myData=Data([[1,2,3,4],["a","b","c","d"],
[2.3,2.1,2.5,3.1]],var_names=["id","name","length"])
>>> print myData
id name length
1    a    2.3
2    b    2.1
3    c    2.5
4    d    3.1

或者那是不可能的?并且只能在视觉上实现(格式化输出的方式)

4

2 回答 2

2

正如其他人所建议的那样,您实际上需要 namedtuple 。这是您需要的可能实现

>>> class Data(object):
    def __init__(self,*args,**kwargs):
        args = args[0]
        var_names = kwargs['var_names']
        self.var_names = namedtuple('Data',var_names)
        self.units = [self.var_names(*e) for e in zip(*args)]
    def __repr__(self):
        fields = [e for e in vars(self.units[0])]
        fmt_string = '{:^10}'*len(fields)
        return '\n'.join(fmt_string.format(*units) for units in self.units)


>>> myData=Data([[1,2,3,4],["a","b","c","d"],
[2.3,2.1,2.5,3.1]],var_names=["id","name","length"])
>>> print myData
    1         a        2.3    
    2         b        2.1    
    3         c        2.5    
    4         d        3.1    
>>> 
于 2012-12-04T17:50:13.090 回答
0

如果我对您的理解正确,我认为使用字典代替列表var_names应该可以满足您的要求。collections.OrderedDict如果订购很重要,请使用。

>>> import collections
>>> var_names = collections.OrderedDict([('id',[1,2,3,4]), 
                                         ('name',['a','b','c','d']), 
                                         ('length',[2.3,2.1,2.5,3.1])])
>>> for name, value in var_names.items(): 
...     print name + ': ' + str(value)
id: [1, 2, 3, 4]
name: ['a', 'b', 'c', 'd']
length: [2.3, 2.1, 2.5, 3.1]
于 2012-12-04T17:36:36.617 回答