python:通过检查每个实例的成员变量(列表)中的项来选择实例列表

时间:2012-06-29 14:15:14

标签: python

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

鉴于:

  1. 类实例列表,例如:l = [c1,c2,c3,...]
  2. 每个实例都有一个成员变量列表,例如c1.memList = [3,2,5],c2.memList = [1,2]
  3. TODO:  选择l中的那些实例,其memList只有'3'模数项,例如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 ]
    

    但是:列表理解不允许这样说“我没有定义”

    问题:如何以pythonic方式对此进行编码?

    新修改:抱歉,我输错了(如果输入错误输入),它有效。我建议结束这个问题。

4 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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)

答案 3 :(得分: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]