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

2016-10-22 22:06:26 +08:00
 jin6220
4468 次点击
所在节点    Python
27 条回复
jin6220
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
2016-10-22 22:32:06 +08:00
(l * (n // len(l) + 1))[:n]
hsj1992
2016-10-22 23:02:47 +08:00
看完条件和结果,第一个反应是输出完一遍 list1 内容后再次输出 n-list1.length 次。
那样的话可以写递归吧?

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

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

引战:还是 Ruby 写起来舒心: lst.cycle.take(n)
shyling
2016-10-23 02:18:29 +08:00
这种简单的方法肯定是从 list 构造一个 stream(cycle),然后 take 咯
kkzxak47
2016-10-23 02:28:56 +08:00
import itertools
list(itertools.islice(itertools.cycle(list1), 0, n))
jin6220
2016-10-23 08:29:30 +08:00
@rogerchen [list1[i%len(list1)] for i in range(n)] 这个不错,原来 1%4 结果会是 1.。。
q397064399
2016-10-23 08:51:35 +08:00
取余大法好,凡是这种要回头遍历的都是取余
liushuaikobe
2016-10-23 10:21:48 +08:00
(list1 * 2)[:n]
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
2016-10-23 18:38:37 +08:00
没学过 py , py 里没有取模运算符吗
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"]))
```

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

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

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

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

© 2021 V2EX