的某些内容无法弄清楚如何在一个漂亮的方式做到这一点:访问列表
我有n个元素, 我想访问列表的每m个元素的列表。
例如:[1,2,3,4,5]且m = 2将给出 [2,4]
我能做到简单地用一个循环,但ins't有一个更“pythonic”的方式?
感谢提前!
编辑:
好像我忘了一些东西。 我想,不仅得到这些值,但修改它们。 我试过切片[:: 2] = 3,但它不起作用。 。 。
我在寻找类似的东西
的某些内容无法弄清楚如何在一个漂亮的方式做到这一点:访问列表
我有n个元素, 我想访问列表的每m个元素的列表。
例如:[1,2,3,4,5]且m = 2将给出 [2,4]
我能做到简单地用一个循环,但ins't有一个更“pythonic”的方式?
感谢提前!
编辑:
好像我忘了一些东西。 我想,不仅得到这些值,但修改它们。 我试过切片[:: 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]
我没有找到一种方法来做我想要的切片。
以下:
candidates[::2] = [1] * len(candidates[::2])
将由1
斯内德的回答取代候选人每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]
谢谢您的回答,这最终导致了我什么,我正在寻找:) – jlengrand 2012-02-03 17:20:53
姆。感谢您的班级实施,但与我的解决方案相比,这不会有点过分了吗? – jlengrand 2012-02-03 17:39:59
我说我不确定我会推荐它!如果你要在很多地方执行这个操作,这个类可能会更好。你的解决方案需要每一行都得到'* len(x [:: 2])',并且在分配的两边复制切片,这就增加了出错的机会。 – 2012-02-03 17:44:17