有一个 List
l = [1, 3, 5, 7, 11, 13, 17]
现在想通过迭代输出成如下:
[1, 3] [3, 5] [5, 7] [7, 11] [11, 13] [13, 17]
除了用索引还有其他办法吗?
for i in range(len(l)-1): print(l[i:i+2])
![]() | 1 mayorbryant 2019-03-18 11:55:12 +08:00 其他方法也是利用索引来实现的,这个已经是很简洁的方式了 |
2 lxy42 2019-03-18 12:02:13 +08:00 In [143]: l = [1, 3, 5, 7, 11, 13, 17] In [144]: for i, j in zip(l[:-1], l[1:]): ...: print(i, j) ...: 1 3 3 5 5 7 7 11 11 13 13 17 In [145]: |
3 fngtz 2019-03-18 12:21:59 +08:00 via iPhone collections.deque |
4 Cl2ex 2019-03-18 12:34:47 +08:00 for p in zip(l,l[1:]): print p |
5 weeevv 2019-03-18 12:40:45 +08:00 via Android [x for x in zip(l[:-1],l[1:,])] |
6 kaneg 2019-03-18 12:49:11 +08:00 不用索引: last = None for i in l: if last: print '[%s,%s]' % (last, i) last = i |
7 fngtz 2019-03-18 12:58:25 +08:00 via iPhone 之前我没回答清楚。 这个问题最方便当然是 zip 列表推导式,但是别人问不要索引啊!就是说 l 是个迭代器。 那本质上就是个单向链表,循环里存上一个值呗。 |
8 xpresslink 2019-03-18 14:05:06 +08:00 ![]() 如果使用直线性思维模式: >>> l = [1, 3, 5, 7, 11, 13, 17] >>> i = iter(l) >>> j = iter(l); next(j) 1 >>> list(zip(i,j)) [(1, 3), (3, 5), (5, 7), (7, 11), (11, 13), (13, 17)] >>> |
![]() | 9 Raisu 2019-03-18 15:11:33 +08:00 l = [1, 3, 5, 7, 11, 13, 17] pre = l[0] for i in range(1, len(l)): print([pre, l[i]]) pre = l[i] 用一直变量保存前一个数,大概这样可以? |
![]() | 10 ruoyu0088 2019-03-18 15:24:00 +08:00 via Android ![]() |
11 di94sh 2019-03-18 15:28:57 +08:00 ```python l = [1, 3, 5, 7, 11, 13, 17] x = zip(l[0:-1], l[1:]) print(list(x)) ``` |
12 darknoll 2019-03-18 16:55:10 +08:00 >>> def fn(l): ... if len(l) < 2: ... return ... i,*args = l ... yield (i, args[0]) ... fn(args) |
15 xpresslink 2019-03-18 18:59:42 +08:00 @fngtz 仔细看一下我#8 我写的,也算是一位吧 ![]() |
![]() | 16 cxyfreedom 2019-03-18 19:12:49 +08:00 via iPhone @ruoyu0088 长见识了,很 pythonic |
![]() | 17 shn7798 2019-03-18 22:02:49 +08:00 @xpresslink 看了下,跟 pairwise 原理一样,不过相比之下就不 pythonic 了哈哈 |
18 xpresslink 2019-03-18 22:17:58 +08:00 @shn7798 用那个 tee 我知道,我只是为演示一下最本质的东西,没必要多 import 一下。 |