嵌套循环中的python list comprehension

时间:2017-10-19 08:06:27

标签: python list-comprehension

列表理解中的一个基本问题,我正在开始,

列表解析可以返回两个数组吗?

就像我试图将我的代码转换为列表理解

getTableData(ConcreteRow.class)

我可以使用列表推导将上面的代码转换为

b=[10,2,3]
c=[10,11,12]
d=[]
f=[]
a=10
for i in b:
    if a>i:
        for j in c:
            d.append(j)

print d

但是现在我想在我的初始代码中添加一个额外的块,看起来像

print [j  for i in b if a>i  for j in c ]

有什么方法可以将这些额外的东西添加到我的初始列表理解中吗?

2 个答案:

答案 0 :(得分:7)

您不能在第二个示例中使用列表推导,因为您没有构建单个列表。列表推导构建一个列表对象,而不是两个。

您可以使用两个单独的列表推导:

d = [j for i in b if a > i for j in c]
f = [i for i in b if a <= i]

或者您可以使用list.extend()+=扩充作业简化您的循环:

for i in b:
    if a > i:
        d.extend(c)
    else:
        f.append(i)

for i in b:
    if a > i:
        d += c
    else:
        f.append(i)

答案 1 :(得分:2)

回答你的问题:

  

列表推导可以返回两个数组吗?

是的,它可以:

>>> [[1] * n for n in [3, 5]]
[[1, 1, 1], [1, 1, 1, 1, 1]]
>>> d, f = [[1] * n for n in [3, 5]]
>>> d
[1, 1, 1]
>>> f
[1, 1, 1, 1, 1]

只是为了好玩,这里有一个单行来定义df

d, f = [[j for i in b if f(i) for j in g(i)] for (f, g) in [(lambda x: x < a, lambda x: c), (lambda x: x >= a, lambda x: [x])]]

但这显然是一个坏主意,@ MartijnPieters的answer更可取。