哪个更适合阵列去除?

时间:2009-09-13 17:15:54

标签: python

我正在删除数组中的项目(如果存在)。

我可以想到两种方法来做到这一点

方式#1

# x array, r item to remove
if r in x :
  x.remove( r )
<#2>方式#2
try :
  x.remove( r )
except :
  pass

时间显示尝试/除外可以更快

(有时我会得到:)。

1.16225508968e-06
8.80804972547e-07

1.14314196588e-06
8.73752536492e-07
import timeit

runs = 10000
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

code1 ="""
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

if r in x :
  x.remove(r)
"""
print timeit.Timer( code1 ).timeit( runs ) / runs

code2 ="""
x = [ '101', '102', '103', '104', '105', 'a', 'b', 'c',
  'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', '111', '112', '113',
  'x', 'y', 'z', 'w', 'wwwwwww', 'aeiojwaef', 'iweojfoigj', 'oiowow',
  'oiweoiwioeiowe', 'oiwjaoigjoaigjaowig',
]
r = 'a'

try :
  x.remove( r )
except :
  pass
"""
print timeit.Timer( code2 ).timeit( runs ) / runs

哪个更pythonic?

5 个答案:

答案 0 :(得分:6)

我总是选择第一种方法。 if in读取比异常处理更清楚。

答案 1 :(得分:5)

那将是:

try:
  x.remove(r)
except ValueError:
  pass
不过,您应该尝试删除列表中没有的项目,以进行全面比较。

答案 2 :(得分:3)

速度取决于命中率与未命中率之比。成为pythonic选择更清晰的方法。

我个人认为方式#1更清晰(拥有'if'块而不是异常块需要更少的行,并且使用更少的脑空间)。当有更多命中而不是未命中时,它也会更快(异常比跳过if块更昂贵)。

答案 3 :(得分:2)

尝试/除外

答案 4 :(得分:1)

第一种方式看起来更清洁。第二个看起来只是为了从列表中删除项目而付出额外的努力。

PEP-8中没有任何关于它的内容,所以无论你喜欢什么,都是“真正的”答案。

说到PEP-8 ......在冒号之前有空间属于“无关的空白”的定义。

相关问题