2012-02-03 46 views
1

的某些内容无法弄清楚如何在一个漂亮的方式做到这一点:访问列表

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

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

我能做到简单地用一个循环,但ins't有一个更“pythonic”的方式?

感谢提前!

编辑:

好像我忘了一些东西。 我想,不仅得到这些值,但修改它们。 我试过切片[:: 2] = 3,但它不起作用。 。 。

我在寻找类似的东西

回答

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

谢谢您的回答,这最终导致了我什么,我正在寻找:) – jlengrand 2012-02-03 17:20:53

+0

姆。感谢您的班级实施,但与我的解决方案相比,这不会有点过分了吗? – jlengrand 2012-02-03 17:39:59

+0

我说我不确定我会推荐它!如果你要在很多地方执行这个操作,这个类可能会更好。你的解决方案需要每一行都得到'* len(x [:: 2])',并且在分配的两边复制切片,这就增加了出错的机会。 – 2012-02-03 17:44:17

0

我没有找到一种方法来做我想要的切片。

以下:

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

将由1

2

斯内德的回答取代候选人每2个元素展示了如何使用切片来访问列表的一部分。您还可以分配到切片,但你需要一个列表分配给切片,例如:

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