只是对我的python类进行了一次了解,并注意到我忘记了如何做到这一点。我知道这很简单,我忽视了一些东西,但我很感激一些帮助!
def outsideIn2(lst):
'''(list)->list
Returns a new list where the middle two elements have been
removed and placed at the beginning of the result. Assume all lists are an even
length
>>> outsideIn2(['C','a','r','t','o','n'])
['r','t','C','a','o','n'] # rt moves to front
>>> outsideIn2(['H','i'])
['H','i'] # Hi moves to front so output remains the same.
>>> outsideIn2(['B','a','r','b','a','r','a',' ','A','n','n','e'])
['r','a','B','a','r','b,','a',' ','A','n','n','e'] # ra moves to front.
'''
length = len(lst)
middle1 = lst.pop((len(lst) / 2) - 1)
middle2 = lst.pop((len(lst) / 2) + 1)
lst.insert([0], middle1)
lst.insert([1], middle2)
return lst
我收到了这个错误:
middle1 = lst.pop((len(lst)/ 2) - 1)
TypeError:期望的整数参数,浮点数
我做错了什么?
答案 0 :(得分:4)
当您升级到Python 3时,“/
”运算符从给出整数除法变为实际除法。切换到“//
”运算符。
答案 1 :(得分:1)
您可以使用//
运算符:
middle1 = lst.pop((len(lst) // 2) - 1)
答案 2 :(得分:1)
其他答案解释了您收到错误的原因。您需要使用//
而不是/
(同样,只需要记录,您需要提供list.insert
个整数,而不是列表。
但是,我想建议一种使用Explain Python's slice notation的不同方法:
def outsideIn2(lst):
x = len(lst)//2
return lst[x-1:x+1]+lst[:x-1]+lst[x+1:]
此方法应明显快于使用list.pop
和list.insert
。
作为证据,我制作了以下脚本,将这两种方法与timeit.timeit
进行比较:
from timeit import timeit
def outsideIn2(lst):
length = len(lst)
middle1 = lst.pop((len(lst) // 2) - 1)
middle2 = lst.pop((len(lst) // 2) + 1)
lst.insert(0, middle1)
lst.insert(1, middle2)
return lst
print(timeit("outsideIn2(['B','a','r','b','a','r','a',' ','A','n','n','e'])", "from __main__ import outsideIn2"))
def outsideIn2(lst):
x = len(lst)//2
return lst[x-1:x+1]+lst[:x-1]+lst[x+1:]
print(timeit("outsideIn2(['B','a','r','b','a','r','a',' ','A','n','n','e'])", "from __main__ import outsideIn2"))
结果如下:
6.255111473664949
4.465956427423038
如您所见,我提出的方法快了~2秒。但是,如果您想验证我的测试,可以运行更多测试。
答案 3 :(得分:0)
使用pop
和insert
(尤其是在位置0和1处插入)对于Python列表来说可能相当慢。由于列表的基础存储是一个数组,因此在位置0处插入意味着位置n-1
处的元素必须移动到位置n
,然后n-2
处的元素必须是移至n-1
,依此类推。 pop
必须反过来做同样的事情。因此,想象一下,在你的小方法中,必须完成多少元素移动。大致是:
pop #1 - move n/2 elements
pop #2 - move n/2 elements
insert 0 - move n elements
insert 1 - move n elements
因此,在此代码中完成了大约3n
次移动。
将列表分成3个切片并重新组合新列表可能更为理想:
def outsideIn2(lst):
midstart = len(lst)//2-1
left,mid,right = lst[0:midstart], lst[midstart:midstart+2], lst[midstart+2:]
return mid+left+right
另外,pop
在第一次和第二次调用pop
之间更改列表长度时,不会遇到任何奇怪的问题。当你得到一个短于2个字符的列表时,切片会隐式防止索引错误。