pop()中间列表中的两个元素

时间:2013-12-12 20:53:26

标签: python list methods pop

只是对我的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:期望的整数参数,浮点数

我做错了什么?

4 个答案:

答案 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.poplist.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)

使用popinsert(尤其是在位置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个字符的列表时,切片会隐式防止索引错误。