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
jin6220
V2EX  ›  Python

n=7 list1=['a','b','c','d'] 知道这两个结果如何输出结果 a b c d a b c ?

  •  
  •   jin6220 · 2016-10-22 22:06:26 +08:00 · 4463 次点击
    这是一个创建于 2952 天前的主题,其中的信息可能已经有所发展或是发生改变。
    27 条回复    2016-10-25 14:32:51 +08:00
    jin6220
        1
    jin6220  
    OP
       2016-10-22 22:08:34 +08:00
    a=['a','b','c','d']
    n=7
    c=0
    while c < n:
    for b in a:
    print(b)
    c+=1
    这样的为什么不行啊
    不是 c <n 的调解不成立时候不再循环么?
    yangtukun1412
        2
    yangtukun1412  
       2016-10-22 22:32:06 +08:00   ❤️ 1
    (l * (n // len(l) + 1))[:n]
    hsj1992
        3
    hsj1992  
       2016-10-22 23:02:47 +08:00
    看完条件和结果,第一个反应是输出完一遍 list1 内容后再次输出 n-list1.length 次。
    那样的话可以写递归吧?

    基准情形就是 n<=list1.length 。
    reus
        4
    reus  
       2016-10-22 23:11:18 +08:00
    zwpaper
        5
    zwpaper  
       2016-10-22 23:15:00 +08:00 via iPhone
    @jin6220 条件判断要执行完 FOR 才会判断。取余输出多好
    upczww
        6
    upczww  
       2016-10-22 23:34:40 +08:00 via Smartisan T1
    2 楼的方法很好
    rogerchen
        7
    rogerchen  
       2016-10-22 23:38:42 +08:00   ❤️ 1
    [list1[i%len(list1)] for i in range(n)]
    binux
        8
    binux  
       2016-10-22 23:40:45 +08:00   ❤️ 2
    ```
    import itertools

    n=7
    list1=['a','b','c','d']
    print list(itertools.islice(itertools.cycle(list1), 0, n))
    ```
    XiaoxiaoPu
        9
    XiaoxiaoPu  
       2016-10-22 23:46:34 +08:00   ❤️ 1
    (list1 * 2)[:n]
    sudoz
        10
    sudoz  
       2016-10-22 23:47:13 +08:00
    KKKKKK
        11
    KKKKKK  
       2016-10-23 00:10:46 +08:00 via Android
    这不是循环模运算嘛!
    lululau
        12
    lululau  
       2016-10-23 00:43:34 +08:00
    4L, 8L 正解

    引战:还是 Ruby 写起来舒心: lst.cycle.take(n)
    shyling
        13
    shyling  
       2016-10-23 02:18:29 +08:00
    这种简单的方法肯定是从 list 构造一个 stream(cycle),然后 take 咯
    kkzxak47
        14
    kkzxak47  
       2016-10-23 02:28:56 +08:00 via Android
    import itertools
    list(itertools.islice(itertools.cycle(list1), 0, n))
    jin6220
        15
    jin6220  
    OP
       2016-10-23 08:29:30 +08:00
    @rogerchen [list1[i%len(list1)] for i in range(n)] 这个不错,原来 1%4 结果会是 1.。。
    q397064399
        16
    q397064399  
       2016-10-23 08:51:35 +08:00
    取余大法好,凡是这种要回头遍历的都是取余
    liushuaikobe
        17
    liushuaikobe  
       2016-10-23 10:21:48 +08:00
    (list1 * 2)[:n]
    BingoXuan
        18
    BingoXuan  
       2016-10-23 15:29:08 +08:00
    import math
    (list1 * math.ceil( n / len(list1) ) )[:7]

    简化这个问题:
    从一个重复 list1 的列表里面取出前 n 个元素;
    确定重复的倍数,重复次数是 list1 元素数量的倍数;
    n / len(list1)再进一即可找到倍数,但由于存在小数的情况,所以调用 math.ceil ()进一取整;

    和 2L 的方法差不多,只是多调用 math 的 ceil 函数。在 python 里面,个人觉得如果可以不写循环尽量不写循环。当需要调用的要素变多,编写循环就会更复杂。
    wemore
        19
    wemore  
       2016-10-23 18:38:37 +08:00 via Android
    没学过 py , py 里没有取模运算符吗
    jackisnotspirate
        20
    jackisnotspirate  
       2016-10-23 21:30:08 +08:00
    ```
    func takeOrCompensate<T>(n: Int, arr: [T], initial: Int = 0) -> [T] {
    if n <= 0 {
    return []
    }

    if arr.count == 0 {
    return []
    }

    return [arr[initial % arr.count]] + takeOrCompensate(n: n-1, arr: arr, initial: (initial + 1))

    }

    print(takeOrCompensate(n: 7, arr: ["a", "b", "c", "d"]))
    ```
    wnduan
        21
    wnduan  
       2016-10-24 04:47:04 +08:00
    @jin6220 前面已经各种正解了。如果要让你的代码得到期望的结果,在 for 循环里加个判断就行了,比如在 print() 前面来个
    if c == n:
    break
    jin6220
        22
    jin6220  
    OP
       2016-10-24 09:38:36 +08:00
    wnduan 在 n=7 list1=['a','b','c','d'] 知道这两个结果如何输出结果 a b c d a b c ? 里回复了你 4 小时 49 分钟前 删除
    @jin6220 前面已经各种正解了。如果要让你的代码得到期望的结果,在 for 循环里加个判断就行了,比如在 print() 前面来个
    if c == n:
    break
    =============
    抱歉 准备回复您呢 点了回复却把你的回复隐藏了 也不知道如何再次显示。
    嗯 这样一改 确实是简单多了。
    a=['a','b','c','d']
    n=7
    c=0
    while c < n:
    for b in a:
    if c==n:
    break
    print(b)
    c+=1
    a
    b
    c
    d
    a
    b
    c
    >>>
    jin6220
        23
    jin6220  
    OP
       2016-10-24 09:40:00 +08:00
    @wnduan 抱歉 准备回复您呢 点了回复却把你的回复隐藏了 也不知道如何再次显示。
    嗯 这样一改 确实是简单多了。
    a=['a','b','c','d']
    n=7
    c=0
    while c < n:
    for b in a:
    if c==n:
    break
    print(b)
    c+=1
    eote
        24
    eote  
       2016-10-24 14:28:40 +08:00
    loop = lambda arr, n, result=[]:len(result) == n and result or loop(arr, n, result + [arr[(len(result)) % len(arr)]])

    loop(list1, n)
    eote
        25
    eote  
       2016-10-24 14:31:05 +08:00
    没看清题目,应该是

    loop = lambda arr, n, result=[]:len(result) == n and ' '.join(result) or loop(arr, n, result + [arr[(len(result)) % len(arr)]])
    wnduan
        26
    wnduan  
       2016-10-25 00:17:47 +08:00
    @jin6220 没关系的,好像只是你自己那里隐藏了,其实我还看的到,哈哈 ~。
    yanzixuan
        27
    yanzixuan  
       2016-10-25 14:32:51 +08:00
    (list1*int(round(n*1.0/len(list1))))[:n]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5342 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:45 · PVG 15:45 · LAX 23:45 · JFK 02:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.