V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Laccuse
V2EX  ›  Python

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

  •  
  •   Laccuse · 2018-08-04 23:19:53 +08:00 · 5100 次点击
    这是一个创建于 2294 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2018-08-05 23:10:27 +08:00
    谢谢大家,想不到第一次提问那么多大佬帮忙,问题已经顺利解决了,这帖子可以沉下去啦:)
    ClutchBear
        1
    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
        2
    ryd994  
       2018-08-05 02:15:13 +08:00 via Android   ❤️ 1
    直接 5 个数一个单位循环不就行了
    而且这样的数出现的周期就是 6,去掉不输出的那个,刚好 5 个输出
    gaohongyuan
        3
    gaohongyuan  
       2018-08-05 02:57:37 +08:00
    @ClutchBear
    直接 range(1005, 10000, 6)就行吧,就不用判断是否被 6 整除了
    Laccuse
        4
    Laccuse  
    OP
       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
        5
    ryd994  
       2018-08-05 10:48:02 +08:00 via Android
    你中间加一个换行不就行了?
    我说的是 5 个数一个循环单元
    yb3712590
        6
    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
        7
    eastrd  
       2018-08-05 11:33:41 +08:00 via Android
    先拿到所有数字,然后分配到两个线程中进行交叉输出+睡眠+循环。
    ClutchBear
        8
    ClutchBear  
       2018-08-05 16:18:39 +08:00
    SilverBullet
        9
    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
        10
    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
        11
    wwg1994  
       2018-08-05 21:16:05 +08:00
    2 楼完美解决,doge
    twor
        12
    twor  
       2018-08-05 21:19:54 +08:00
    @Laccuse 1L 的就蛮好的,语法简单,代码也不长。
    flag 就是一个变量,用于输出 2、3 间隔的,非常简单,不要想复杂了
    Laccuse
        13
    Laccuse  
    OP
       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 看来我理解还不够啊哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.