在Python中,如何返回列表列表中第一个非负列表的索引?
所需的输出是第一个非负列表的索引 假设我嵌套了一个数字列表,如下所示。我试图找出如何删除负数列表的值,或者只是返回列表中所有值都为正数的索引 我的想法是枚举或循环一个函数,检查列表是否有负值,然后从列表中弹出或删除 还是使用列表理解在Python中,如何返回列表列表中第一个非负列表的索引?,python,Python,所需的输出是第一个非负列表的索引 假设我嵌套了一个数字列表,如下所示。我试图找出如何删除负数列表的值,或者只是返回列表中所有值都为正数的索引 我的想法是枚举或循环一个函数,检查列表是否有负值,然后从列表中弹出或删除 还是使用列表理解 # pseudocode x = [[-1, -2, -1], [-1, -3, -1], [1, 2, 2]] index_x = [x.index(non_negative(x)) for x in data] print(index_x) # 2 您可以将
# pseudocode
x = [[-1, -2, -1], [-1, -3, -1], [1, 2, 2]]
index_x = [x.index(non_negative(x)) for x in data]
print(index_x)
# 2
您可以将
next
与生成器表达式一起使用,并enumerate
+all
。您的逻辑相当于查找包含所有非负值的第一个子列表的索引
x = [[-1, -2, -1], [-1, -3, -1], [1, 2, 2]]
res = next((idx for idx, sub in enumerate(x) if all(i >= 0 for i in sub)), None)
# 2
只有当您希望提取与某个条件匹配的所有子列表的索引时,列表理解才有用。内置的
next
函数从iterable中检索第一个值。如果未找到子列表,则将返回指定的None
。为什么不这样做?只需反复浏览列表
from functools import reduce
x = [[-1, -2, -1], [-1, -3, -1], [1, 2, 2]]
for index, sublist in enumerate(x):
if reduce(lambda a, b: a >= 0 and b >= 0, sublist):
print(index)
break
为此,我只使用了一个带有提前返回的函数,我觉得这使“发现此问题时停止查找”的意图更加清晰:
第一个非负列表的索引在给定的子列表中是否也有正负值的混合?在我的情况下,没有出现这种混合,但我可能需要注意。如果没有混合,那么您可以执行
index_x=[I for I,j in enumerate(x)If sum(j)>0]
def first_non_negative(lsts):
for idx, lst in enumerate(lsts):
if all(it > 0 for it in lst):
return idx