【发布时间】:2015-09-25 03:43:38
【问题描述】:
以如下代码为例:
a = [['James Dean'],['Marlon Brando'],[],[],['Frank Sinatra']]
n = 0
for i in a:
print a[n][0]
n = n + 1
我似乎遇到了索引值错误:
IndexError: list index out of range
如何跳过名为 a 的列表中的空列表?
【问题讨论】:
以如下代码为例:
a = [['James Dean'],['Marlon Brando'],[],[],['Frank Sinatra']]
n = 0
for i in a:
print a[n][0]
n = n + 1
我似乎遇到了索引值错误:
IndexError: list index out of range
如何跳过名为 a 的列表中的空列表?
【问题讨论】:
阅读您的代码,我假设您尝试获取列表中每个非空条目的内部列表的第一个元素,并打印出来。我喜欢这种语法:
a = [['James Dean'],['Marlon Brando'],[],[],['Frank Sinatra']]
# this filter is lazy, so even if your list is very big, it will only process it as needed (printed in this case)
non_empty_a = (x[0] for x in a if x)
for actor in non_empty_a : print (actor)
正如其他答案所述,这是有效的,因为空列表在 if 表达式中被转换为 False
【讨论】:
您可以进行测试,也可以捕获异常。
# Test
for i in a:
if a[n]:
print a[n][0]
n = n + 1
# Exception
for i in a:
try:
print a[n][0]
except IndexError:
pass
finally:
n = n + 1
您甚至可以使用精简的print "\n".join(e[0] for e in a if e),但它的可读性相当差。
顺便说一句,我建议使用 for i, element in enumerate(a) 而不是手动递增 n
【讨论】:
您可以检查列表是否为空,空列表在布尔上下文中具有False 值-
for i in a:
if i:
print a[n][0]
n = n + 1
另外,你可以使用enumerate函数,而不是单独使用n,它返回当前元素以及索引-
for n, i in enumerate(a):
if i:
print a[n][0] # though you could just do - print i[0]
【讨论】:
简单:
for i in a:
if i:
print i[0]
此答案有效,因为当您在 if 语句中将列表(如 i)转换为布尔值时,就像我在这里所做的那样,它会评估列表是否为空,非,这就是你想要的。
【讨论】: