有关list遍历的习惯

有关list遍历的习惯

最近写一个东西,感觉从头到尾写得最多的就是for x in range(len(xlist)):...
in生成器的做法确实很方便,但不能得到索引数字——似乎可以用b_index = xlist.index(x)这样的做法,但我不知道这样做对性能影响大不大,特别是当数组非常大的时候。

不知各位有没更好的方法,讨论下。
for idx, item in enumerate(xlist)
ll = [1, 2, 3, 4]
for i in ll:
    print i
还可以使用xrange来生成序列。


QUOTE:
原帖由 zqc53 于 2007-5-26 08:31 发表
最近写一个东西,感觉从头到尾写得最多的就是for x in range(len(xlist)):...
in生成器的做法确实很方便,但不能得到索引数字——似乎可以用b_index = xlist.index(x)这样的做法,但我不知道这样做对性能影响大 ...

我感觉用 for x in range.... 这样的,对性能还是有点影响,
很可能是需要先生成一个list,
前段时间我在用for x in range(1000000000) 的时候,居然把solaris给跑的所有fork都出错。。。
range占用内存要比xrange大得多,所以建议使用xrange
This function is very similar to range(), but returns an ``xrange object'' instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously. The advantage of xrange() over range() is minimal (since xrange() still has to create the values when asked for them) except when a very large range is used on a memory-starved machine or when all of the range's elements are never used (such as when the loop is usually terminated with break).
Note: xrange() is intended to be simple and fast. Implementations may impose restrictions to achieve this. The C implementation of Python restricts all arguments to native C longs ("short" Python integers), and also requires that the number of elements fit in a native C long.


说的很清楚了!


QUOTE:
原帖由 星尘细雨 于 2007-5-28 09:26 发表
for x in range(1000000000)

这么用只能说明你不熟悉python,不出问题才怪。
list要删除里面的某些元素,怎么做?

一个简单的代码就是这样:

[Copy to clipboard] [ - ]
CODE:
l = [1, 2, 3, 3, 3]

for i in l:
    if i == 3:
        l.remove(i)

print l

但结果不对,    显示的是   [1, 2, 3]

那好,换个删法

[Copy to clipboard] [ - ]
CODE:
l = [1, 2, 3, 3, 3]

for i in range(len(l)):
    if l[i] == 3:
        del l[i]

print l

结果跟惨,直接抛IndexError了

再试一个

[Copy to clipboard] [ - ]
CODE:
l = [1, 2, 3, 3, 3]

for i in range(len(l)-1, -1, -1):
    if l[i] == 3:
        del l[i]

print l

噢,这次可以了, 但这种方法并不是很漂亮.
再用个漂亮的方法吧, python手册推荐的

[Copy to clipboard] [ - ]
CODE:
l = [1, 2, 3, 3, 3]

l = filter(lambda x: x != 3, l)
print l

倒序删除可以成功,而其他的遍历删除法都会出错.
说明了一旦你进入了list的遍历循环中,再对这个list做操作时一定要小心,很多错误看起来并不明显.
最好使用用系统给的那些函数,filter, reduce, map

python不是推荐用[]替代filter么
l = [1, 2, 3, 3, 3]
l=[i for i in l if i!=3]