首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当列表索引超出范围时在列表上环绕

当列表索引超出范围时在列表上环绕
EN

Stack Overflow用户
提问于 2014-03-02 09:11:04
回答 4查看 28K关注 0票数 17

我正在寻找一些代码改进,或者我自己实现的预构建版本,因为我认为可能有或应该有更干净的方法来实现我想要的东西。

我正在写一个软件来转换吉他标签到古典符号,我需要转换标签上的数字到它相应的音符,这将是有用的,从开始的字符串建立每个字符串音符的列表。

我有一个音符列表(a - g#)和一个音符列表(0,21)。

Notesfret在前11个音符上工作得很好,但在那之后,我显然得到了一个out of index错误。

我要解决这个问题的代码如下:

代码语言:javascript
复制
notes = ["a", "a#", "b", "c", "c#", "d", "e", "f", "f#", "g", "g#"]
note = 21
while note >= len(notes):
    note -= 11
    try:
        print notes[note]
    except:
        continue

它可以工作,但是它看起来有点长,有没有更好的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-02 09:12:42

使用% operator生成一个模数:

代码语言:javascript
复制
notes[note % len(notes)]

演示:

代码语言:javascript
复制
>>> notes = ["a", "a#", "b", "c", "c#", "d", "e", "f", "f#", "g", "g#"]
>>> note = 21
>>> notes[note % len(notes)]
'g#'

或者在循环中:

代码语言:javascript
复制
>>> for note in range(22):
...     print notes[note % len(notes)],
... 
a a# b c c# d e f f# g g# a a# b c c# d e f f# g g#
票数 36
EN

Stack Overflow用户

发布于 2014-03-02 09:36:23

另一种选择是使用itertools.cycle

代码语言:javascript
复制
>>> import itertools
>>> notes = ["a", "a#", "b", "c", "c#", "d", "e", "f", "f#", "g", "g#"]

>>> frets = range(21)
>>> for note, fret in itertools.izip(itertools.cycle(notes), frets):
        print ("[%s, %d]" %(note, fret))

[a, 0]
[a#, 1]
[b, 2]
[c, 3]
[c#, 4]
[d, 5]
[e, 6]
[f, 7]
[f#, 8]
[g, 9]
[g#, 10]
[a, 11]
[a#, 12]
[b, 13]
[c, 14]
[c#, 15]
[d, 16]
[e, 17]
[f, 18]
[f#, 19]
[g, 20]
票数 5
EN

Stack Overflow用户

发布于 2014-03-02 09:13:06

使用模运算符:

代码语言:javascript
复制
In [3]: notes = ["a", "a#", "b", "c", "c#", "d", "e", "f", "f#", "g", "g#"]

In [4]: len(notes)
Out[4]: 11

In [5]: note = 11

In [6]: notes[note]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-6-707e7e351463> in <module>()
----> 1 notes[note]

IndexError: list index out of range

In [7]: notes[note%len(notes)]
Out[7]: 'a'

In [8]: notes[note-11]
Out[8]: 'a'
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22122623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档