迭代列表中的空列表 - python

时间:2015-07-07 14:56:57

标签: python list iteration

以下面的代码为例:

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?

的列表中的空列表

4 个答案:

答案 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