原始代码有点复杂,我简化为:
鉴于:
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方式对此进行编码?
新修改:抱歉,我输错了(如果输入错误输入),它有效。我建议结束这个问题。
答案 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]