以下面的代码为例:
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?
的列表中的空列表答案 0 :(得分:6)
简单:
for i in a:
if i:
print i[0]
这个答案有效,因为当你像我在这里所做的那样将列表(如i
)转换为if
语句中的布尔值时,它会评估列表是否不是空,这就是你想要的。
答案 1 :(得分:3)
您可以检查列表是否为空,空列表在布尔上下文中具有False
值 -
for i in a:
if i:
print a[n][0]
n = n + 1
此外,您可以使用n
函数,而不是单独使用enumerate
,它返回当前元素以及索引 -
for n, i in enumerate(a):
if i:
print a[n][0] # though you could just do - print i[0]
答案 2 :(得分:0)
您可以进行测试,也可以捕获异常。
#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'
u="$(grep -m 1 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep -m 1 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
sed -i "s/^user=/user="${u}"/" "$SCRIPT_PATH"
sed -i "s/^pass=/pass="${p}"/" "$SCRIPT_PATH"
user=
pass=
你甚至可以使用精简#!/bin/bash
SCRIPT_PATH=`pwd`/`basename $0`
username=admin
password='pass1234'
u="$(grep -m 1 'username' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
p="$(grep -m 1 'password' $SCRIPT_PATH | awk -F'=' '{ print $2 }')"
sed -i "s/^user=/user="${u}"/" "$SCRIPT_PATH"
sed -i "s/^pass=/pass="${p}"/" "$SCRIPT_PATH"
user=admin
pass='pass1234'
,但它的可读性相当低。
顺便说一下,我建议使用# 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)
答案 3 :(得分:0)
读取代码,我假设您尝试获取列表中每个非空条目的内部列表的第一个元素,并打印出来。我喜欢这种语法:
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-expression
中将空列表转换为False