我和我的这个答案有同样的感觉:我读过的所有答案在我看来似乎都是在创建一个新对象。
我更喜欢对列表进行就地修改。
在下面的代码中,我删除了每个列表中不需要的部分(因为列表已排序,所以很容易),并且我尊重EADP编码风格(请求宽恕比许可更容易)
d={1:[1,6,16,32,50],2:[1,5,15],7:[6,7,9],13:[10,12,23,55]}
k = 15
for ki,li in d.items():
try:
x = next(x for x in li if x>=k)
except:
del d[ki]
else:
i = li.index(x)
li[0:i] = []
print d
# {1: [16, 32, 50], 2: [15], 13: [23, 55]}
.
编辑 1
我更改了代码。这不是很好,因为我不得不迭代d.items()
而不是d.iteritems()
: 在最后一种情况下,在迭代期间不能修改字典。
.
编辑 2
我试过了bisect_left()
,它确实是最快的解决方案。这是下面的第三个代码。第二个是更正 RussW 的一个。第一个是我以前的代码
k = 15
te = clock()
for jj in xrange(10000):
d={1:[1,6,16,32,50],2:[1,5,15],7:[6,7,9],13:[10,12,23,55]}
for ki,li in d.items():
try:
x = next(x for x in li if x>=k)
except:
del d[ki]
else:
i = li.index(x)
li[0:i] = []
print clock() - te
print d
print '------------------------------------------'
d={1:[1,6,16,32,50],2:[1,5,15],7:[6,7,9],13:[10,12,23,55]}
te = clock()
for jj in xrange(10000):
dct={1:[1,6,16,32,50],2:[1,5,15],7:[6,7,9],13:[10,12,23,55]}
for key, lst in dct.items():
gn = None
for i, x in enumerate(lst):
if x >= k:
gn = i
break
if gn is None:
del dct[key]
else:
dct[key] = lst[gn:]
print clock() - te
print dct
print '------------------------------------------'
te = clock()
for jj in xrange(10000):
d={1:[1,6,16,32,50],2:[1,5,15],7:[6,7,9],13:[10,12,23,55]}
for ki,li in d.items():
i = bisect_left(li,15)
if i==len(li):
del d[ki]
else:
li[0:i] = []
print clock() - te
print d
结果
0.22918869577
{1: [16, 32, 50], 2: [15], 13: [23, 55]}
------------------------------------------
0.163871665254
{1: [16, 32, 50], 2: [15], 13: [23, 55]}
------------------------------------------
0.100142057161
{1: [16, 32, 50], 2: [15], 13: [23, 55]}