我想知道如何在列表解析中执行多个命令。
你能给我一个简单的例子:
[print ("bla1") and print ("bla2") for i in list]
所以对于4长度4的列表,我会:
bla1
bla2
bla1
bla2
bla1
bla2
bla1
bla2
相反,我没有在文档中轻易找到它。 (如果你能看到一个明显的原因,我没有,可以让我知道我应该如何搜索更好的东西。)
编辑:好的,根据评论,这是一个非常糟糕的例子。 我我有兴趣从旧的创建一个新的,但我觉得我需要两个命令来做到这一点。 (当然不是简单的印刷品)。 例如。我有一个列表列表,我想创建一个操作子列表的结果列表。
答案 0 :(得分:26)
不要将list comprehension用于命令。列表推导用于创建列表,而不是用于命令。使用普通的旧循环:
for i in list:
print('bla1')
print('bla2')
列表理解是充满独角兽和巧克力的奇妙事物,但它们不是一切的解决方案。
答案 1 :(得分:12)
你可以使用元组来完成这样的工作:
[(print("bla1"), print("bla2")) for i in list]
它正常工作。
答案 2 :(得分:2)
列表推导仅用于以列表形式生成数据,而不是用于多次执行语句(或任何其他副作用,如写入文件)。使用for
查找。
假设您要生成列表['bla1', 'bla2', 'bla1', ...]
:一般情况下,您无法执行此操作,每次迭代都会将单个结果值放入列表中。该值可能是一个列表本身,但是您有一个列表列表。
在您的示例的特定情况下,有可能:使用['bla' + str(i + 1) for x in list for i in range(2)]
,每range(2)
次迭代x in list
,因此list
每个项目生成两个值1}}。 (list
是一个变量的坏名称,因为它已经由内置函数使用。)
答案 3 :(得分:1)
如果“我需要两个命令”意味着有两个功能,它们必须以某种方式相关。
def f( element ):
return intermediate
def g( intermediate ):
return final
new_list = [ g(f(x)) for x in old_list ]
如果这不合适,你必须提供(a)不能编写的函数的定义,以及(b)为新序列创建单个结果。
答案 4 :(得分:0)
仅将列表推导用于创建列表。您的示例根本不使用列表的值。
根据文件:
“列表推导提供了一种从序列创建列表的简明方法。”
for i in range(len(your_list)):
print "blah1"
print "blah2"
在上面的程序中,我们甚至不关心列表中的值。如果您正在寻找不同于您在问题中所述的列表理解应用,那么请发帖。
答案 5 :(得分:0)
为了它的价值,可以在list comprehension中使用list.append来生成一个新列表,同时忽略列表推导的主要输出。 OP提到了一份清单清单。举个例子:
>>> master = [range(x,x+2) for x in range(10)]
>>> master
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]
然后通过操纵每个子列表(如编辑中描述的OP)创建一个新列表
>>> new_list = []
>>> [[new_list.append(l[0]*l[1]),new_list.append(l[0]+l[1])] for l in master]
[[None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None]]
>>> new_list
[0, 1, 2, 3, 6, 5, 12, 7, 20, 9, 30, 11, 42, 13, 56, 15, 72, 17, 90, 19]
这会使用Nones吐出冗余的列表列表,但也会使用产品和子列表的总和填充变量new_list。
答案 6 :(得分:0)
在某些情况下,调用包含两个语句的函数是可以接受的。
def f():
print("bla1")
print("bla2")
[f() for i in l]
还可以向函数发送参数。
def f(i):
print("bla1 %d" % i)
print("bla2")
l = [5,6,7]
[f(i) for i in l]
输出:
bla1 5
bla2
bla1 6
bla2
bla1 7
bla2
答案 7 :(得分:0)
列表推导和关系(集合推导,字典推导,生成器表达式)都是使单个命令内的循环表达成为可能的语法。未能意识到这一事实的Pedantics不必要地限制了Python,而那些传授“最佳实践”福音的人则以毫无意义的教条阻碍了他们的追随者。不再只是序列!如果这是最干净的解决方案,请执行所有所需的命令。不使用表达式的输出(通常是[None,None]之类的列表)并不比在方法/函数完成后暂时超出范围的临时“变量”更糟糕。