使用if语句的嵌套列表理解

时间:2018-09-27 12:25:55

标签: python list if-statement list-comprehension

我正在努力了解嵌套列表的理解,并阅读了出色的说明here

我要翻译的问题是我在内部循环中有一个PropTypes.objectOf(PropTypes.oneOfType([ PropTypes.string, PropTypes.number, ])) 子句,而在我失去了if步骤时,我看不到如何将其应用于从嵌套循环转到列表理解时,我从func()获得计数器。

enumerate()

嵌套列表理解可能类似于

nested_list = [[{'a': 1, 'b': 2}, {'c': 3, 'd': 4}], [{'a': 5, 'b': 6}, {'c': 7, 'd': 8}]]
new_list = []
for c, x in enumerate(nested_list):
    for d, y in enumerate(x):
        if d == 1:
            new_list.append(y)
print(new_list)
[{'c': 3, 'd': 4}, {'c': 7, 'd': 8}]

...但是我看不到/想不到如何获取该子句,因为我在嵌套列表理解下没有计数器。

是否有实现此目标的方法?还是应该坚持嵌套循环方法?

4 个答案:

答案 0 :(得分:7)

您可以将其重写如下:

new_list = [y for x in nested_list for d, y in enumerate(x) if d == 1]

循环按“自然”顺序进行,条件以最后结束。仅在y

时包括d==1

一个可能的结果(因为没有排序命令):

[{'c': 3, 'd': 4}, {'c': 7, 'd': 8}]

请注意,在您的情况下,编写起来更简单,更有效(O(n)O(n**2)):

new_list = [x[1] for x in nested_list]

唯一的区别是,如果x太短,则后面的代码将中断,因此可能会测试长度:

new_list = [x[1] for x in nested_list if len(x)>1]

答案 1 :(得分:3)

  

当我从嵌套循环转到列表理解时,我失去了从enumerate()获得的计数器。

那你为什么丢掉它?列表推导仍然可以使用与for循环相同的所有迭代器。

  

我的内部循环中有一个if子句,看不到如何应用

只需将其放在同一位置即可。对于for循环和if过滤器,列表推导遵循相同的嵌套顺序。您可以通过删除:冒号,并将.append(...)调用中的部分移到最前面来直接映射您的循环:

new_list = [y   # from new_list.append(y)
    for c, x in enumerate(nested_list)   # removed the :
        for d, y in enumerate(x)         # removed the :
            if d == 1]                   # removed the :

但是,您可以删除第一个enumerate(),因为您不使用c。您还可以删除第二个循环和enumerate(),因为可以使用 indexing 代替:

new_list = [x[1] for x in nested_list]

您无需在此处遍历x中的所有值,这不是一种获得该值的非常有效的方法。

如果您的问题是x列表可能短了 并且在索引1处没有元素,请首先过滤长度上嵌套的列表:

new_list = [x[1] for x in nested_list if len(x) > 1]

答案 2 :(得分:1)

您想要列表中每个数组的第二个元素,因此您可以执行以下操作:

new_list = [nested_list[i][1] for i in range(len(nested_list))]

更好还是

new_list  = [x[1] for x in nested_list]

答案 3 :(得分:0)

print ([ y for c, x in enumerate(nested_list) for d, y in enumerate(x) if d == 1])