访问列表的某些元素

时间:2012-02-03 17:07:48

标签: python

无法弄清楚如何以一种漂亮的方式做到这一点:

我有一个n个元素的列表, 我想访问列表中的每个m元素。

例如:[1,2,3,4,5]和m = 2会给出 [2,4]

我可以简单地用循环来做,但是不是有更“pythonic”的方式吗?

先谢谢!

编辑:

好像我忘记了什么。 我想,不仅要获得这些值,还要修改它们。 我尝试切片[:: 2] = 3,但它不起作用。 。 。

我正在寻找类似的东西

3 个答案:

答案 0 :(得分:4)

切片语法为您完成此任务:

>>> my_list = range(10)
>>> my_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> my_list[::2]
[0, 2, 4, 6, 8]
>>> my_list[1::2]
[1, 3, 5, 7, 9]

这是一种包装列表以获得您想要的原始分配行为的方法,但我不确定我是否会推荐它:

class AssignableSlice(list):
    def __setitem__(self, i, v):
        if isinstance(i, slice):
            for ii in xrange(*i.indices(len(self))):
                self[ii] = v
        else:
            super(AssignableSlice, self).__setitem__(i, v)

a = AssignableSlice(range(10))
print a
a[::2] = 3
print a
a[1::3] = 99
print a

产生

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 1, 3, 3, 3, 5, 3, 7, 3, 9]
[3, 99, 3, 3, 99, 5, 3, 99, 3, 9]

答案 1 :(得分:2)

Ned的回答显示了如何使用切片访问列表的一部分。您也可以指定切片,但需要为切片指定列表,例如:

>>> my_list = range(5)
>>> my_list
[0, 1, 2, 3, 4]
>>> my_list[::2]
[0, 2, 4]
>>> my_list[::2] = [0, 0, 0]
>>> my_list
[0, 1, 0, 3, 0]

请注意,当切片中的步骤超出默认值1时,您指定的列表需要具有相同的长度,但是使用默认步骤,您实际上可以使用切片分配更改列表的大小:

>>> my_list = range(5)
>>> my_list
[0, 1, 2, 3, 4]
>>> my_list[:1]
[0]
>>> my_list[:1] = [4, 3, 2]   # replace the first item with 3 new items
>>> my_list
[4, 3, 2, 1, 2, 3, 4]
>>> my_list[2:5]
[2, 1, 2]
>>> my_list[2:5] = []         # remove the middle three items from the list
>>> my_list
[4, 3, 3, 4]

答案 2 :(得分:0)

我juste找到了一种方法来做我想要的切片。

以下内容:

candidates[::2] = [1] * len(candidates[::2])

将以1

替换候选人的每2个元素