在 Python 中,我有一个长度为 x 的数组。
让数组 = [0, 1, 2, 3, 4, 5]
我想从上面的数组中得到这样的结果: [1, 2, 3, 4, 5, 0]
所以基本上我不想跳过第一个术语并在数组结束后循环它并在最后一个跳过的术语上停止。我对python很陌生,所以我自己无法弄清楚+谷歌搜索没有帮助。
请帮助,非常感谢!
使用切片和append()
.
lst = [0, 1, 2, 3, 4, 5]
new_lst = lst[1:]
new_lst.append(lst[0])
您也可以使用new_lst.extend(lst[:1])
,尽管当头部切片是单个元素时,append(lst[0])
可能会稍微更有效,因为您不必构造另一个临时列表来包装单个值。 可能是最糟糕的,因为与版本lst[1:] + list[:1]
相比,它必须创建另一个丢弃列表对象。extend()
我会选择切片,但另一种选择(对于使用collections.deque的这种简单的事情来说,这通常是矫枉过正的)
小例子:
>>> e = [0, 1, 2, 3, 4, 5]
>>> from collections import deque
>>> d = deque(e)
>>> d
deque([0, 1, 2, 3, 4, 5])
>>> d.rotate(1)
>>> d
deque([5, 0, 1, 2, 3, 4])
>>> d.rotate(-2)
>>> d
deque([1, 2, 3, 4, 5, 0])
e = [0, 1, 2, 3, 4, 5]
e.append(e.pop(0))
为什么人们不立即考虑就地转换???
当您遍历列表时,甚至不需要新变量
for i in my_list[1:] + my_list[:1]:
print i,
print
for i in my_list:
print i,
将返回:
1 2 3 4 5 0
0 1 2 3 4 5
这样您就不会对原始 my_list 进行任何更改。
另外,请看这里:Explain Python's slice notation
还有一种方式,可能更通用。想不出好名字...
def iterate_from(l, start):
for i in range(start, len(l)):
yield l[i]
for i in range(start):
yield l[i]
我得到以下输出:
In [39]: iterate_from(range(7), 3)
Out[39]: <generator object iterate_from at 0x120259b40>
In [40]: list(iterate_from(range(7), 3))
Out[40]: [3, 4, 5, 6, 0, 1, 2]
使用切片获取列表中您感兴趣的部分,然后将它们相加:
>>> lst = [0, 1, 2, 3, 4, 5]
>>> lst[1:] + lst[:1]
[1, 2, 3, 4, 5, 0]
lst[1:]
将为您提供从第一个索引(包括)到列表末尾的所有内容。
lst[:1]
将为您提供从列表开头到第一个索引(不包括)的所有内容。(这相当于[lst[0]]
)