无法弄清楚如何以一种漂亮的方式做到这一点:
我有一个n个元素的列表, 我想访问列表中的每个m元素。
例如:[1,2,3,4,5]和m = 2会给出 [2,4]
我可以简单地用循环来做,但是不是有更“pythonic”的方式吗?
先谢谢!
编辑:
好像我忘记了什么。 我想,不仅要获得这些值,还要修改它们。 我尝试切片[:: 2] = 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个元素