Python中如何实现两个数字一行,三个数字一行交替输出?
今天看到一题 java 的题目,# 输出 4 位数中能被 3 整除不能被 6 整除的数,两个数字一行,三个数字一行交替输出。
想试试如何用 python 实现,鄙人 python 初学者,还望各位指点一下
Python中如何实现两个数字一行,三个数字一行交替输出?
python<br>flag = 0<br>for i in range(1002, 9999 + 1, 3):<br> if i % 6 != 0:<br> print(i, end=" ")<br> flag += 1<br> if flag == 2:<br> print()<br> if flag == 5:<br> print()<br> flag = 0<br>
def alternate_print(numbers):
"""
交替输出:两个数字一行,三个数字一行
"""
i = 0
while i < len(numbers):
# 两个数字一行
if i + 2 <= len(numbers):
print(' '.join(map(str, numbers[i:i+2])))
i += 2
# 三个数字一行
if i + 3 <= len(numbers):
print(' '.join(map(str, numbers[i:i+3])))
i += 3
# 测试代码
if __name__ == "__main__":
# 示例数据
test_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
alternate_print(test_data)
这个实现的核心逻辑是:
- 用
while循环遍历数字列表 - 先输出两个数字(如果剩余数字足够)
- 再输出三个数字(如果剩余数字足够)
- 通过索引
i跟踪当前位置
运行结果:
1 2
3 4 5
6 7
8 9 10
11 12
如果数字总数不是5的倍数,最后可能会剩下1-4个数字,代码中的边界检查会确保不会越界。
总结:用循环加条件判断控制输出格式。
直接 5 个数一个单位循环不就行了
而且这样的数出现的周期就是 6,去掉不输出的那个,刚好 5 个输出
直接 range(1005, 10000, 6)就行吧,就不用判断是否被 6 整除了
我把你的代码跑了一下,不知道是不是我的格式问题,输出的只是那些数字,并没有按要求分行输出。看下去虽说能理解,但是本人对 flag 函数不是很熟悉,望指点。
还有我的方法求满足要求的整数是:
i_d = [i for i in range(1000, 10000) if i % 3 == 0 and i % 6 != 0]
这个列表我想再遍历输出的话就有点不知道怎么下手了
如果是五个数一个单位,那么是否会五个五个地输出呢,这似乎和题目不太符合啊- -。题目要求的是单数行输出两个数,双数行的输出三个数
你中间加一个换行不就行了?
我说的是 5 个数一个循环单元
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))
先拿到所有数字,然后分配到两个线程中进行交叉输出+睡眠+循环。
用 numpy 非常简单。python<br>import numpy as np<br>data = np.arange(1000,10000)<br>data = data[(data%3 == 0) * (data%6 != 0)].reshape(-1, 5)<br>[print('{} {}\n{} {} {}'.format(*row)) for row in data]<br>
获取到 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)]) )
2 楼完美解决,doge
1L 的就蛮好的,语法简单,代码也不长。
flag 就是一个变量,用于输出 2、3 间隔的,非常简单,不要想复杂了
那我大概懂你的意思了,受你的启发我做了一个和你想的有点出入的,谢谢指教
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(’’)
厉害,只是我还没学到 itertool 里面的 zip_longest,有机会再继续研究吧,谢谢
多线程现在还在摸索,看下来方法挺多的,也是思路一种,谢谢大佬指教
- -看了你的图是我傻逼了,真不知道当时是怎么复制进去修正格式的,谢谢,现在可以了
百度了下似乎挺好用的一个包,我回头再研究下,谢谢
辛苦了,写得很详细,只是现在对你的那个 None 不理解
已经回头看了,可能是我对那些陌生的变量接触得比较少吧,我还傻乎乎地去查 flag 了,还以为是插旗了哈哈,谢谢指点
看来我理解还不够啊哈哈

