Python 负数列表索引作为切片处理

1 投票
2 回答
828 浏览
提问于 2025-04-17 04:17

我有一些嵌套的列表,它们就像一个表格。我想访问上面n行的元素,这个操作很简单。不过,我的问题是,我希望能够处理那些超出表格范围的情况,也就是当我访问的索引不在表格内时,程序能够做出反应。但我发现,负数索引在这种情况下会被当作切片处理,结果就变成了“循环”访问。

这里有个例子:

lists = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
for i in range(len(lists)):
    for k in [-1,0,1]:
        print, lists[i+k][0]
    print


11 1 6
1 6 11
6 11
IndexError: list index out of range

我希望第一次调用的时候能抛出一个IndexError(索引错误),或者触发某种事件,让我的程序能够做出反应。

有什么想法吗?

2 个回答

0

当它尝试打印整行数据时,会出现错误。

lists = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
merged=zip(*lists)
keys=[-1,0,1]
row=merged[0]
for i,_ in enumerate(row):
        print " ".join((str(row[k+i]) for k in keys))

输出:

11 1 6
1 6 11
Traceback (most recent call last):
  File "asdf.py", line 6, in <module>
    print " ".join((str(row[k+i]) for k in keys))
  File "asdf.py", line 6, in <genexpr>
    print " ".join((str(row[k+i]) for k in keys))
IndexError: tuple index out of range

如果你不是在用Python 3,可以使用izip。

1

因为切片的功能是Python语法自带的,所以我建议在你的循环里加一个简单的'if'语句:

for k in [-1, 0, 1]:
    idx = i+k
    if idx < 0: raise IndexError, 'list index is out of range'
    print lists[idx][0]

撰写回答