Python 访问列表中的某些元素

Python 访问列表中的某些元素,python,Python,我不知道如何以一种漂亮的方式做到这一点: 我有一个n个元素的列表, 我想访问列表中的每m个元素 例如:[1,2,3,4,5]和m=2将给出 [2,4] 我可以简单地用一个循环来完成,但是没有更“pythonic”的方法吗 提前谢谢 编辑: 好像我忘了什么。 我想,不仅要得到这些值,还要修改它们。 我试着切片a[::2]=3,但它不起作用 我正在搜索类似的东西切片语法为您实现了以下功能: >>> my_list = range(10) >>> my_list [

我不知道如何以一种漂亮的方式做到这一点:

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

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

我可以简单地用一个循环来完成,但是没有更“pythonic”的方法吗

提前谢谢

编辑:

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


我正在搜索类似的东西

切片语法为您实现了以下功能:

>>> 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]

切片语法为您实现了以下功能:

>>> 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]

我只是找到了一种方法来做我想用切片

以下是:

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

将每2个候选元素替换为1

我刚刚找到了一种使用切片的方法

以下是:

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

将每2个候选元素替换为1个

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]

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]

谢谢你的回答,这最终让我找到了我想要的:)哼。感谢您的类实现,但与我下面的解决方案相比,这不是有点过分了吗?我说我不确定我会推荐它!如果要在许多地方执行此操作,则该类可能会更好。你的解决方案需要每一行都把
*len(x[::2])
弄对,同时在作业的两边都复制一个片段,这增加了出错的机会。谢谢你的回答,这最终让我找到了我要找的:)哼哼。感谢您的类实现,但与我下面的解决方案相比,这不是有点过分了吗?我说我不确定我会推荐它!如果要在许多地方执行此操作,则该类可能会更好。您的解决方案需要这些行中的每一行都正确地获得
*len(x[::2])
,并在赋值的两侧复制切片,这会增加出错的机会。