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

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

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


Python中如何实现两个数字一行,三个数字一行交替输出?
14 回复

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)

这个实现的核心逻辑是:

  1. while循环遍历数字列表
  2. 先输出两个数字(如果剩余数字足够)
  3. 再输出三个数字(如果剩余数字足够)
  4. 通过索引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 了,还以为是插旗了哈哈,谢谢指点

看来我理解还不够啊哈哈

回到顶部