list comprehension python中的多个动作

时间:2011-10-07 14:31:59

标签: python list-comprehension

我想知道如何在列表解析中执行多个命令。

你能给我一个简单的例子:

[print ("bla1") and print ("bla2") for i in list]

所以对于4长度4的列表,我会:

bla1
bla2
bla1
bla2
bla1
bla2
bla1
bla2

相反,我没有在文档中轻易找到它。 (如果你能看到一个明显的原因,我没有,可以让我知道我应该如何搜索更好的东西。)

编辑:好的,根据评论,这是一个非常糟糕的例子。 我有兴趣从旧的创建一个新的,但我觉得我需要两个命令来做到这一点。 (当然不是简单的印刷品)。 例如。我有一个列表列表,我想创建一个操作子列表的结果列表。

8 个答案:

答案 0 :(得分:26)

不要将list comprehension用于命令。列表推导用于创建列表,而不是用于命令。使用普通的旧循环:

for i in list:
    print('bla1')
    print('bla2') 

列表理解是充满独角兽和巧克力的奇妙事物,但它们不是一切的解决方案。

答案 1 :(得分:12)

你可以使用元组来完成这样的工作:

[(print("bla1"), print("bla2")) for i in list]

它正常工作。

答案 2 :(得分:2)

  1. 列表推导仅用于以列表形式生成数据,而不是用于多次执行语句(或任何其他副作用,如写入文件)。使用for查找。

  2. 假设您要生成列表['bla1', 'bla2', 'bla1', ...]:一般情况下,您无法执行此操作,每次迭代都会将单个结果值放入列表中。该值可能是一个列表本身,但是您有一个列表列表。

  3. 在您的示例的特定情况下,有可能:使用['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]之类的列表)并不比在方法/函数完成后暂时超出范围的临时“变量”更糟糕。