有一个 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 1
如果使用直线性思维模式:
>>> 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 9
|
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 一下。
|