我面临一个特殊的问题,最近我觉得需要生成某种类型的列表理解。
例如:
[ re.search('xyz', l).group(0) for l in my_list if re.search('xyz', l) ]
Run Code Online (Sandbox Code Playgroud)
现在,敏锐的读者可能已经观察到这个列表理解进行了正则表达式匹配两次。
我想消除这种“额外”开销,从而失去列表理解的优雅性。以前有人遇到过这样的问题吗?如果是这样,他们是如何解决这个问题的?
一般来说,我有一个f()应用于x列表中的值/对象的函数,现在我希望f(x).b当且仅当f(x).a满足某些条件时才将其包含在我的列表中。
我知道
empty_list = []
for l in my_list:
match = re.search('xyz', l)
if match:
empty_list.append(match.group(0))
Run Code Online (Sandbox Code Playgroud)
或者更一般地说:
empty_list = []
for x in my_list:
val = f(x)
if val.a == condition:
empty_list.append(val.b)
Run Code Online (Sandbox Code Playgroud)
是一个可能的解决方案,但这似乎太冗长了,我确信有一种更“Pythonic”的方法可以做到这一点。
Python 3.4.0a1
视窗 8.1
创建的类:
class Bank(object):
bankrupt = False
Run Code Online (Sandbox Code Playgroud)
命令在 IDLE 中输入,__main__结果如下:
>>> a = Bank()
>>> b = Bank()
>>> a.bankrupt
False
>>> b.bankrupt
False
>>> b.bankrupt = True
>>> b.bankrupt
True
>>> a.bankrupt
False
Run Code Online (Sandbox Code Playgroud)
当我更改 b.bankrupt 时,我预计 a.bankrupt 会更改为 True,因为变量 bankrupt 是为整个类定义的,而不是为单个实例定义的(带有self.bankrupt) 为什么这没有发生?
有人可以解释为什么我收到错误:
global name 'helloWorld' is not defined
Run Code Online (Sandbox Code Playgroud)
执行以下操作时:
class A:
def helloWorld():
print 'hello world'
class B(A):
def displayHelloWorld(self):
helloWorld()
class Main:
def main:
b = B()
b.displayHelloWorld()
Run Code Online (Sandbox Code Playgroud)
我已经习惯了java,其中B类显然会有一个A类方法"helloWorld"的副本,因此这个代码在执行main时运行正常.然而,这似乎认为B类没有任何称为"helloWorld"的方法