请问 Python 如何实现两个数字一行,三个数字一行交替输出?

2018-08-04 23:19:53 +08:00
 Laccuse

今天看到一题 java 的题目,# 输出 4 位数中能被 3 整除不能被 6 整除的数,两个数字一行,三个数字一行交替输出。

想试试如何用 python 实现,鄙人 python 初学者,还望各位指点一下

5067 次点击
所在节点    Python
13 条回复
ClutchBear
2018-08-05 01:17:26 +08:00
```python
flag = 0
for i in range(1002, 9999 + 1, 3):
if i % 6 != 0:
print(i, end=" ")
flag += 1
if flag == 2:
print()
if flag == 5:
print()
flag = 0
```
ryd994
2018-08-05 02:15:13 +08:00
直接 5 个数一个单位循环不就行了
而且这样的数出现的周期就是 6,去掉不输出的那个,刚好 5 个输出
gaohongyuan
2018-08-05 02:57:37 +08:00
@ClutchBear
直接 range(1005, 10000, 6)就行吧,就不用判断是否被 6 整除了
Laccuse
2018-08-05 10:24:10 +08:00
@ClutchBear 我把你的代码跑了一下,不知道是不是我的格式问题,输出的只是那些数字,并没有按要求分行输出。看下去虽说能理解,但是本人对 flag 函数不是很熟悉,望指点。

还有我的方法求满足要求的整数是:
i_d = [i for i in range(1000, 10000) if i % 3 == 0 and i % 6 != 0]
这个列表我想再遍历输出的话就有点不知道怎么下手了

@ryd994 如果是五个数一个单位,那么是否会五个五个地输出呢,这似乎和题目不太符合啊- -。题目要求的是单数行输出两个数,双数行的输出三个数
ryd994
2018-08-05 10:48:02 +08:00
你中间加一个换行不就行了?
我说的是 5 个数一个循环单元
yb3712590
2018-08-05 10:57:20 +08:00
from itertools import zip_longest
numbers = [str(i) for i in range(1002, 10000, 3) if i%3 ==0 and i%6 != 0]
groups = ['%s %s%s%s %s %s'%(i[0], i[1],'\n' if i[2] else '', i[2], i[3], i[4]) for i in zip_longest(*[iter(numbers)]*5,fillvalue='')]
print('\n'.join(groups))
eastrd
2018-08-05 11:33:41 +08:00
先拿到所有数字,然后分配到两个线程中进行交叉输出+睡眠+循环。
ClutchBear
2018-08-05 16:18:39 +08:00
SilverBullet
2018-08-05 17:17:33 +08:00
用 numpy 非常简单。
```python
import numpy as np
data = np.arange(1000,10000)
data = data[(data%3 == 0) * (data%6 != 0)].reshape(-1, 5)
[print('{} {}\n{} {} {}'.format(*row)) for row in data]
```
THsoul
2018-08-05 17:45:20 +08:00
获取到 4 位数中能被 3 整除不能被 6 整除的数
list = filter(None, [i if(i%3 is 0 and i%6 is not 0) else None for i in range(1000, 10000)])

写一个返回指定长度并从元列表中剔除这些元素的方法
def push_num(list, reqlen):
count = 0
req = []
while count is not reqlen:
req.append(list[0])
del list[0]
count += 1
return req

再写一个交替判断
def list_slice(list):
req = []
req.append(push_num(list, 2))
while True:
if len(list) is 0:
return req
if len(req[-1]) is 3:
req.append(push_num(list, 2))
elif len(req[-1]) is 2:
req.append(push_num(list, 3))

最后 结合一下
list_slice( filter(None, [i if(i%3 is 0 and i%6 is not 0) else None for i in range(1000, 10000)]) )
wwg1994
2018-08-05 21:16:05 +08:00
2 楼完美解决,doge
twor
2018-08-05 21:19:54 +08:00
@Laccuse 1L 的就蛮好的,语法简单,代码也不长。
flag 就是一个变量,用于输出 2、3 间隔的,非常简单,不要想复杂了
Laccuse
2018-08-05 23:09:05 +08:00
@ryd994 那我大概懂你的意思了,受你的启发我做了一个和你想的有点出入的,谢谢指教

i_d = [i for i in range(1000, 10000) if i % 3 == 0 and i % 6 != 0]
for j in range(len(i_d)):
print(i_d[j], end=' ')
if (j+4) % 5 == 0 or (j-4) % 5 == 0:
print('')


@yb3712590 厉害,只是我还没学到 itertool 里面的 zip_longest,有机会再继续研究吧,谢谢

@eastrd 多线程现在还在摸索,看下来方法挺多的,也是思路一种,谢谢大佬指教

@ClutchBear - -看了你的图是我傻逼了,真不知道当时是怎么复制进去修正格式的,谢谢,现在可以了


@SilverBullet 百度了下似乎挺好用的一个包,我回头再研究下,谢谢


@THsoul 辛苦了,写得很详细,只是现在对你的那个 None 不理解

@twor 已经回头看了,可能是我对那些陌生的变量接触得比较少吧,我还傻乎乎地去查 flag 了,还以为是插旗了哈哈,谢谢指点

@wwg1994 看来我理解还不够啊哈哈

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

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

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

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

© 2021 V2EX