Python3 如何做到操作一次迭代两次

2019-03-18 11:45:49 +08:00
 zscself

有一个 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])
3857 次点击
所在节点    Python
18 条回复
mayorbryant
2019-03-18 11:55:12 +08:00
其他方法也是利用索引来实现的,这个已经是很简洁的方式了
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]:
fngtz
2019-03-18 12:21:59 +08:00
collections.deque
Cl2ex
2019-03-18 12:34:47 +08:00
for p in zip(l,l[1:]):
print p
weeevv
2019-03-18 12:40:45 +08:00
[x for x in zip(l[:-1],l[1:,])]
kaneg
2019-03-18 12:49:11 +08:00
不用索引:

last = None
for i in l:
if last:
print '[%s,%s]' % (last, i)
last = i
fngtz
2019-03-18 12:58:25 +08:00
之前我没回答清楚。

这个问题最方便当然是 zip 列表推导式,但是别人问不要索引啊!就是说 l 是个迭代器。

那本质上就是个单向链表,循环里存上一个值呗。
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)]
>>>
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]

用一直变量保存前一个数,大概这样可以?
ruoyu0088
2019-03-18 15:24:00 +08:00
文档里面有,在下面的页面搜索 pairwise

https://docs.python.org/3.7/library/itertools.html
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))
```
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)
fngtz
2019-03-18 17:01:24 +08:00
@ruoyu0088 找到一位真 pythoneer
fcfangcc
2019-03-18 17:08:00 +08:00
@ruoyu0088 厉害,学习了
xpresslink
2019-03-18 18:59:42 +08:00
@fngtz 仔细看一下我#8 我写的,也算是一位吧
cxyfreedom
2019-03-18 19:12:49 +08:00
@ruoyu0088 长见识了,很 pythonic
shn7798
2019-03-18 22:02:49 +08:00
@xpresslink 看了下,跟 pairwise 原理一样,不过相比之下就不 pythonic 了哈哈
xpresslink
2019-03-18 22:17:58 +08:00
@shn7798 用那个 tee 我知道,我只是为演示一下最本质的东西,没必要多 import 一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/545716

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX