我正在努力了解嵌套列表的理解,并阅读了出色的说明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}]
...但是我看不到/想不到如何获取该子句,因为我在嵌套列表理解下没有计数器。
是否有实现此目标的方法?还是应该坚持嵌套循环方法?
答案 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])