0

原始代码有点复杂,我将其简化为:

鉴于:

  1. 类实例列表,例如:l=[c1,c2,c3, ...]
  2. 每个实例都有一个成员变量列表,例如 c1.memList=[3,2,5], c2.memList=[1,2]

Todo: 选择 l 中那些 memList 只有 '3'-modulo item 的实例,例如 c3.memList=[3,6,9,3,27]

这样编码:

newl = [ n for n in l if len( [m for m in n.memList if m%3] )==0 ]

但是:列表理解不允许这样说'm未定义'

问题:如何以pythonic方式编码?

新编辑:对不起,我打错字了(如果输入错误),它起作用了。我将提议结束这个问题。

4

4 回答 4

1

您提供的代码对我有用!我不确定你遇到了什么问题。但是,我会以不同的方式编写我的列表理解:

[n for n in l if not any(m % 3 for m in n.memList)]

测试:

>>> class Obj(object):
...     def __init__(self, name, a):
...         self.name = name
...         self.memList = a
...     def __repr__(self):
...         return self.name
...     
>>> objs = [Obj('a', [3, 2, 5]), Obj('b', [3, 6, 9, 3, 27])]
>>> [n for n in objs if not any(m for m in n.memList if m % 3)]
[b]
于 2012-06-29T14:38:51.367 回答
1

我没有收到有关“未定义 m”的任何错误,原因必须在此代码段之外。

newl = [ n for n in l if all([ m % 3 == 0  for m in n.memList]) ]

我会推荐这样的东西, all() 函数提高了可读性。使用列表语法总是好的,因为它可以加快计算速度。

于 2012-06-29T14:39:23.720 回答
0

我认为这就是您要寻找的。它比你的方法要冗长得多,但是 python 强调可读性。

    class c(object):
    def __init__(self, memlist):
        self.m = memlist


    c1 = c([3,6,9])
    c2 = c([1,5,7])
    l = [c1,c2]
    newl = []
    for n in l:
        b = True
        for x in n.m:
            if x % 3 != 0:
                b = False
        if b != False:
            newl.append(n)
于 2012-06-29T14:33:03.633 回答
0

这是我所拥有的

c1.memList = [0, 1, 2, 3]
c2.memList = [0, 1]
c3.memList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]

这个代码:

for y in l:
    newl = []
    for m in y.memList:
        if m%3 == 0:
            newl.append(m)
    print newl

结果我得到了这个:

[0, 3]
[0]
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
于 2012-06-29T14:37:10.587 回答