2016-07-29 381 views
0

如何返回对象列表,而不是在这里列出。 我想返回测试对象的列表,而不是STR的列表..lambda,python中的对象数组映射 - 返回对象列表

class test: 
    val = "" 
    def __init__(self,v): 
     self.val = v 
    def tolower(self,k): 
     k = k.val.lower() 
     return k 

def test_run(): 
    tests_lst = [] 
    tests_lst.append(test("TEST-0")) 
    tests_lst.append(test("TEST-1")) 
    tests_lst.append(test("TEST-2")) 
    i_want_object_of_test = map(lambda x:x.val.lower(),tests_lst) 

if __name__ == '__main__': 
    test_run() 

OUTPUT: [ '测试 - 0', '测试 - 1', '测试-2']

我想要一个测试对象的列表,其中每个对象的val已经改为小写。

+1

你的问题是如此不清楚。请清楚说明预期的输出和您获得的输出。您当前的代码不会输出或打印任何东西... – Julien

+0

我想要map(lambda x:x.val.lower(),tests_lst)返回测试对象列表。它返回一个字符串列表。 – digicoder

+0

首先,当你在类体中写入'val =“”'时,这是一个* class-level *变量,而不是一个实例属性。你有没有来自Java这样的语言?在'__init__'后面,当你写'self.val = v'时,你创建了一个影射类变量的实例变量。无论如何,'val.lower()'返回一个字符串,它填充地图返回的列表。地图是功能性的结构,用于转换数据,你不应该用它们来改变状态(尽管你可以如果你真的想要的话)。相反,做一个for循环,对于test_list中的x:x.val = x.val.lower()' –

回答

0

这个问题还不清楚。我会根据我的理解来回答。

我的理解是,您正在尝试创建一个新的测试对象列表,其值为小写。

你可以通过改变每个对象的状态在一个循环做到这一点无论(改变状态,通常不推荐):

for test_obj in test_lst: 
    test_obj.val = test_obj.val.lower() 

通过列表理解来做到这一点的方法是创建新的测试实例:

i_want_object_of_test = [test(test_obj.val.lower()) for test_obj in test_lst] 

此外,还有一些问题与你的测试类:

  • 它,我您应该始终从您的类中的对象继承:class test(object):
  • 您可以通过将val = ""'放入您的类defenition中来定义类变量,然后在每个实例中重写它。
  • 您的tolower方法获取另一个测试实例(k)并以小写形式返回其值。我假设你想要返回一个新的测试对象或改变当前的测试对象。无论哪种方式,该方法应该只使用self
+0

[test_obj.val.lower())for test_obj in test_lst]是我寻找的魔术线​​,我知道不会在迭代时使对象状态发生变化。感谢您对python指南的帮助。 – digicoder

+0

如果我有汽车(对象),并且在那里我有引擎是引擎(对象)的一个实例:并且引擎有一个名为val =“”的文本属性,我想要将所有val属性更改为小写。你能帮忙吗? – digicoder

+0

@digicoder取决于您是否要更改每个引擎的val状态,更改每个引擎的引擎,或者完全创建它们的副本。 –