所以,我想创建一个列表,它是一些现有的列表的子列表。
例如,
L = [1, 2, 3, 4, 5, 6, 7]
我想创建一个子列表li
,使得li
包含所有的元素L
在奇数位置。
虽然我可以做到这一点
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
但我想知道是否有另一种方式来有效和更少数量的步骤做。
解
是的你可以:
l = L[1::2]
这是所有。 结果将包含放置在下述位置中的元素( 0
系,所以第一个元素是在位置0
,第二个为1
等):
1, 3, 5
这样的结果(实际数)为:
2, 4, 6
说明
的[1::2]
在端部仅仅是列表切片的符号。 通常它是在下面的表格:
some_list[start:stop:step]
如果我们忽略start
,默认值( 0
)将被使用。 因此,第一个元件(在位置0
,因为索引是0
-基)将被选择。 在这种情况下,第二元件将被选择。
由于第二元件被省略,则默认正在使用(列表的末端)。 因此,名单正在从第二个元素到最后迭代。
我们还提供了第三个参数( step
),其是2
。 这意味着一个元素将被选中,接下来将被跳过,等等...
这样,总结一下,在这种情况下[1::2]
是指:
- 在第二个元件(其中,顺便说一下,为奇数元件,如果从指数判断),
- 跳过一个元件(因为我们有
step=2
,所以我们正在跳过一个,作为一个相反的step=1
这是默认值), - 取的下一个元素,
- 重复步骤2 - 3。 直到到达列表的末尾,
编辑 :@PreetKukreti给了一个链接,Python的名单切片符号另一种解释。 在这里看到: 解释一下Python的切片符号
附加功能-更换与柜台enumerate()
在代码中,你明确地创建和增加计数器。 在Python这是没有必要的,因为你可以通过一些迭代使用枚举enumerate()
for count, i in enumerate(L):
if count % 2 == 1:
l.append(i)
以上提供完全相同的目的,您正在使用的代码:
count = 0
for i in L:
if count % 2 == 1:
l.append(i)
count += 1
更多关于模拟for
在Python与反循环: 访问在Python指数“为”循环
对于奇数位置,你可能想:
>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
我很喜欢,因为他们的数学(集)语法的列表理解。 那么这个怎么样:
L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]
基本上,如果你枚举的列表,你会得到的指数x
和值y
。 我在做什么这里是把价值y
到输出列表(偶数或奇数),并使用该指数x
,以找出是否该点是奇数( x%2 != 0
)。