2008年2月15日

enumerate() 我们相识得太晚了 >_<

一直以来,我都被一个问题困扰着,怎么优雅的完成这样的代码.
for i in range(len(L)):
item = L[i]
# ... compute some result based on item ...
L[i] = result
昨天在帮猪君战这个程序的还被着实的郁闷了一把

def balance(size_list):
size_list.sort()
size_list.extend([0]* len(size_list))
a = size_list[0::2]
b = size_list[1::2]
while(True):
a_value = sum(a)
b_value = sum(b)
diff = a_value - b_value
min_set = (abs(diff),0,0)
for i in xrange(len(a)):
for j in xrange(len(b)):
tmp_diff = abs(diff - (a[i] - b[j])*2)
if tmp_diff < min_set[0]:
min_set = (tmp_diff, i, j)
if abs(diff) <= min_set[0]:
break
else:
tmp = a[min_set[1]]
a[min_set[1]] = b[min_set[2]]
b[min_set[2]] = tmp
def is_not_zero(x):
return x != 0
return (filter(is_not_zero, a),filter(is_not_zero,b), min_set[0])

结果,今天在reddit上乱晃的时候看到Intermediate Python: Pythonic file searches,
看到用了enumerate这个内置函数,果然够 Pythonic.

虽然性能还是有点损失,不过,代码清晰不少,告别for i in range(list) , 这样写吧.
for i, item in enumerate(L):
# ... compute some result based on item ...
L[i] = result

娘的,居然是python 2.3就加入的特性,人家居然现在才知道,
立马订阅了pep的rss - -#

没有评论: