当你无法保证列表时,大多数pythonic方法将列表截断为N个索引至少是N长度?

时间:2012-02-19 18:12:19

标签: python

当你不能保证列表甚至是N长度时,将列表截断为N个索引的最pythonic方法是什么?像这样:

l = range(6)

if len(l) > 4:
    l = l[:4]

我对python很新,我正在努力学习pythonicly。我想甚至截断列表的原因是因为我将以预期的长度枚举它,我只关心前4个元素。

4 个答案:

答案 0 :(得分:11)

Python自动处理,优雅地超出范围的列表索引。

In [5]: k = range(2)

In [6]: k[:4]
Out[6]: [0, 1]

In [7]: k = range(6)

In [8]: k[:4]
Out[8]: [0, 1, 2, 3]

BTW,简并切片行为在The Python tutorial中解释。这是一个很好的起点,因为它很快就涵盖了很多概念。

答案 1 :(得分:5)

你在这里得到它:

lst = lst[:4]

无论列表中的项目数是多少,这都有效,即使它小于4.

如果你想让它总是有4个元素,用(如)零填充它或None如果它太短,试试这个:

lst = (lst + [0] * 4)[:4]

如果您有这样的问题,通常可以尝试并查看会发生什么,或者在文档中查找。

顺便说一下,给变量list命名是个坏主意;这会阻止您引用内置的list类型。

答案 2 :(得分:4)

到目前为止,所有答案都没有截断列表。他们按照您的示例将名称分配给 new 列表,该列表包含旧列表中最多4个元素。要截断现有列表,请删除索引为4或更高的元素。这很简单:

del lst[4:]

继续你真正想做的事情,一种可能性是:

for i, value in enumerate(lst):
    if i >= 4:
        break
    do_something_with(lst, i, value)

答案 3 :(得分:1)

我认为回答你问题的最pythonic解决方案是:

for x in l[:4]:
    do_something_with(x)

优点:

  1. 这是做你所追求的最简洁和最具描述性的方式。
  2. 我建议pythonic方法是切片源数组而不是截断它。一旦你从源数组中删除元素,它们就会永远消失,虽然在你琐碎的例子中很好,但我认为一般来说这不是一个很好的做法。
  3. 将数组切割到前四个几乎肯定比从尾部删除可能的大量元素更有效。