如何倒序遍历list?

442 views
Skip to first unread message

nillfeng

unread,
Feb 3, 2009, 2:23:44 AM2/3/09
to python-cn`CPyUG`华蟒用户组
正序遍历很优雅
for i in somelist:
print i

倒序的话 怎么更方便点?

limodou

unread,
Feb 3, 2009, 2:29:13 AM2/3/09
to pyth...@googlegroups.com
2009/2/3 nillfeng <fengs...@hotmail.com>:

for i in reversed(somelist):
print i


--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: http://uliwebproject.appspot.com
My Blog: (new)http://http://hi.baidu.com/limodou
(old)http://www.donews.net/limodou

vicalloy

unread,
Feb 3, 2009, 2:29:26 AM2/3/09
to pyth...@googlegroups.com
可以这样做,不过不优雅
lst = [1,2,3]
i = len(lst)
while i > 0:
print i
i -= 1

2009/2/3 nillfeng <fengs...@hotmail.com>:

ken zheng

unread,
Feb 3, 2009, 2:31:02 AM2/3/09
to pyth...@googlegroups.com
for i in somelist[::-1]:
   print i

2009/2/3 vicalloy <zbi...@gmail.com>



--
永远占据我的心

xxmplus

unread,
Feb 3, 2009, 2:32:38 AM2/3/09
to pyth...@googlegroups.com
很典型的c-style啊:D

2009/2/3 vicalloy <zbi...@gmail.com>:

--
Any complex technology which doesn't come with documentation must be the best
available.

vicalloy

unread,
Feb 3, 2009, 2:37:17 AM2/3/09
to pyth...@googlegroups.com
其实有时候用一些不是太优雅的方法也没啥,容易理解就好。
不过刚才的程序我写错了,应当是
lst = [1,2,'a']

i = len(lst)
while i > 0:
i -= 1
print lst[i]

2009/2/3 xxmplus <xxm...@gmail.com>:

nillfeng

unread,
Feb 3, 2009, 2:44:44 AM2/3/09
to python-cn`CPyUG`华蟒用户组
为了倒序遍历 把list反转一下 会不会效率上损失比较大? 这个跟效率有关系么?

或者这个函数只是 倒序遍历的迭代器, 并不反转这个list

On 2月3日, 下午3时29分, limodou <limo...@gmail.com> wrote:
> 2009/2/3 nillfeng <fengshi...@hotmail.com>:

Albert Lee

unread,
Feb 3, 2009, 2:50:52 AM2/3/09
to pyth...@googlegroups.com
>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> reversed(s)
<listreverseiterator object at 0x66530>
>>>


只是产生一个iterator


2009/2/3 nillfeng <fengs...@hotmail.com>:

vicalloy

unread,
Feb 3, 2009, 3:00:35 AM2/3/09
to pyth...@googlegroups.com
应当不只,如果没有复制,那lst改变后reversed后的也应当变才对。
不过也没有性能问题还是做个测试最清楚,比猜靠谱多了。
lst = [1,2,'a']
ss = reversed(lst)
lst.append('ok')
for s in ss:
print s

2009/2/3 Albert Lee <hanzh...@gmail.com>:

nillfeng

unread,
Feb 3, 2009, 3:27:11 AM2/3/09
to python-cn`CPyUG`华蟒用户组
如果是迭代器 在生成这个迭代器的时候获取了 list 的len ,以后再改变,这个迭代器就不是很管用了
我做的实验不是append 是 remove

lst = [1,2,'a']
ss = reversed(lst)
lst.remove(2)

for s in ss:
print s

发现这个就不输出了

On 2月3日, 下午4时00分, vicalloy <zbir...@gmail.com> wrote:
> 应当不只,如果没有复制,那lst改变后reversed后的也应当变才对。
> 不过也没有性能问题还是做个测试最清楚,比猜靠谱多了。
> lst = [1,2,'a']
> ss = reversed(lst)
> lst.append('ok')
> for s in ss:
> print s
>

> 2009/2/3 Albert Lee <hanzhup...@gmail.com>:

Albert Lee

unread,
Feb 3, 2009, 3:52:34 AM2/3/09
to pyth...@googlegroups.com
lst = [1,2,'a']
ss = reversed(lst)
lst[0] = 'b'

for s in ss:
print s

a
2
b


如果改变了现有元素的值,会打印新的。说明,迭代器记录的是一个索引位置,迭代器生成时指向第3个元素,后面不管append几个元素,在使用迭代器时,都是
3,2,1 的顺序输出列表元素。 因此,append不会影响。


2009/2/3 nillfeng <fengs...@hotmail.com>:

shell909090

unread,
Feb 3, 2009, 3:55:15 AM2/3/09
to pyth...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

nillfeng 写道:

迭代器的内部工作机理是通过index的,因此一旦需要从列表中删除数据,最好
是通过filter函数,如果自己去循环就出错了。
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkmIBnMACgkQxx/N+qwtsRaIXgCfYHyc806CJ6uIPF/QDHh1wown
s8UAnjlatUH2GyiuDtt3knDCau8e9Bpo
=sVzO
-----END PGP SIGNATURE-----

Albert Lee

unread,
Feb 3, 2009, 10:12:51 AM2/3/09
to pyth...@googlegroups.com
> 迭代器的内部工作机理是通过index的,因此一旦需要从列表中删除数据,最好
> 是通过filter函数,如果自己去循环就出错了。

看习惯了,删除还是直接删好,filter 会生成新的对象,不过更函数式一些。前面的迭代子还是现用现生成好,不然中间对象被改变了,结果就不可预料了。

shell909090

unread,
Feb 3, 2009, 11:08:06 AM2/3/09
to pyth...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Albert Lee 写道:

我说的是删除多个数据,这时候你不能循环,因为一旦删除,循环条件就被破坏了。
最明显的例子是从[1, 0, 0, 2, 4]中循环删除所有0。此时会漏掉一个。


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkmIa+UACgkQxx/N+qwtsRbyZgCggrjwBkT9GNXtGeHmZl5rfa2S
HZkAnjztVhjqpwNohAdyvd3cm8uPHGZl
=40m3
-----END PGP SIGNATURE-----

骨头

unread,
Feb 7, 2009, 8:07:59 AM2/7/09
to pyth...@googlegroups.com
前面ken zheng似乎已经给出最完美的答案了……

for i in somelist[::-1]:
   print i



列表中过滤删除多个元素,还是新建一个list比较好……
例如: print [_v for _v in [1,0,0,2,4] if _v != 0]

Reply all
Reply to author
Forward
0 new messages