如何从整数列表中剪切元素

时间:2013-09-21 22:58:49

标签: python list integer

如果我有一个整数列表

    x=[0, 0, 119, 101, 108, 108, 99, 111, 109]

我想从左边剪切2个元素

    x=[119, 101, 108, 108, 99, 111, 109]

我该怎么办?

2 个答案:

答案 0 :(得分:6)

使用Python's slice notation

>>> x = [0, 0, 119, 101, 108, 108, 99, 111, 109]
>>> x = x[2:]
>>> x
[119, 101, 108, 108, 99, 111, 109]

这会将第三项中的每个元素都添加到列表的末尾,我们只需将x的值设为该值。

答案 1 :(得分:0)

Nein nein nein

很抱歉,我不认为Haidro的解决方案是好的,因为重新分配是不必要的。

请参阅:

x = [0, 0, 119, 101, 108, 108, 99, 111, 109]
print id(x)
x = x[2:]
print id(x)

print

y = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(y)
y[:2] = []
print id(y)

结果

18713576
18739528

18711736
18711736

编辑1

显示x = x[2:]导致问题的示例:

x = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(x),x

gen = ((i,a+100) for i,a in enumerate(x))

for u in xrange(4):
    print '%d %d' % gen.next()

x = x[2:]
print 'x = x[2:]\n',id(x),x

for u in xrange(4):
    print '%d %d' % gen.next()

print '--------------------------'

y = [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
print id(y),y

gen = ((i,b+100) for i,b in enumerate(y))

for u in xrange(4):
    print '%d %d' % gen.next()

y[:2] = []
print 'y[:2] = []\n',id(y),y

for u in xrange(4):
    print '%d %d' % gen.next()

结果

18713576 [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
0 100
1 100
2 219
3 201
x = x[2:]
18711736 [119, 101, 108, 108, 99, 111, 109, 1003]
4 208
5 208
6 199
7 211
--------------------------
18740128 [0, 0, 119, 101, 108, 108, 99, 111, 109, 1003]
0 100
1 100
2 219
3 201
y[:2] = []
18740128 [119, 101, 108, 108, 99, 111, 109, 1003]
4 199
5 211
6 209
7 1103

在第一种情况下(x = x [2:]),x被重新分配给另一个对象。但是在重新分配之前创建的生成器仍然使用相同的列表对象来生成元素。这可能是某些代码中的问题 但在其他情况下,其他代码也可能是一个问题 我的意思是我们没有受到x = x[2:]的保护而导致问题,绝对是。

编辑2

z[:] = z[2:]y[:2] = []明显不同:

import dis

print 'y[:2] = []'
def f(z):
    y[:2] = []
dis.dis(f)
print '====================='
print 'z[:] = z[2:]'
def f(z):
    z[:] = z[2:]
dis.dis(f)

结果

y[:2] = []
  7           0 BUILD_LIST               0
              3 LOAD_GLOBAL              0 (y)
              6 LOAD_CONST               1 (2)
              9 STORE_SLICE+2       
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        
=====================
z[:] = z[2:]
 12           0 LOAD_FAST                0 (z)
              3 LOAD_CONST               1 (2)
              6 SLICE+1             
              7 LOAD_FAST                0 (z)
             10 STORE_SLICE+0       
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE