1

我对python中的课程相当陌生,所以请温柔。我的脚本比这复杂一点,但这基本上归结为:

class primary_state:
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z
        self.substates=[]

    def add_substate(self,i,j,k):
        self.substates.append(self.substate(i,j,k))

    class substate:
        def __init__(self,i,j,k):
            self.i = i
            self.j = j
            self.k = k

state = primary_state(1,2,3)
state.add_substate(4,5,6)
state.add_substate(7,8,9)

现在我的问题是:是否可以从每个对象返回一个值数组?所以例如我想做:

state.substates[:].i

并让它返回 4 和 7 的值,但是子状态是一个列表,所以它无法处理它。还必须有一种更有效的方法来做到这一点,但我还没有完全弄清楚。任何建议/想法将不胜感激!谢谢。

4

3 回答 3

4

使用列表推导

[sub.i for sub in state.substates]

这大致相当于以下内容:

x = []
for sub in state.substates:
    x.append(sub.i)

除了更短,它是一个可以嵌入其他表达式而不是一系列语句的表达式。

于 2013-08-22T02:18:50.760 回答
0

您可以通过调用获取子状态列表:

[substate.i for substate in self.substates]

于 2013-08-22T02:17:44.263 回答
0

正如其他答案所指出的那样,列表推导是做到这一点的方法。

如果主要状态类的唯一工作是保存子类,那么您可以使您的类表现得像一个可迭代的。在您给出的示例中,这主要是语法糖,但它可能很有用。有关如何执行此操作的完整说明在这里, 但它非常简单:

class PrimaryState(object):  #always use "new style" classes! its 2013!
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z
        self.substates=[]

    def __len__(self):
       return len(self.substates)

    def __getitem__(self, index):
       return self.substates[index]

    def __iter__(self):
       for sub in substates: yield sub

    def __contains__(self, item):
        return item in self.substates

        def add(self, item): 
            self.substates.append(item)

这样你就可以做到:

 primary = PrimaryState(1,2,3)
 primary.add(SubState(4,5,6))
 primary.add(SubState(7,8,9))

 for item in primary:
     print item

 # Substate 4,5,6
 # Substate 7,8,9

PS:查看PEP-8,用于命名类等的标准 python 样式指南。并使用新的样式类(从对象继承)。走在路上很重要!

于 2013-08-22T04:04:26.597 回答