gpt4 book ai didi

python循环索引

转载 作者:太空宇宙 更新时间:2023-11-04 09:12:07 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来获取音阶的音符。这就是我到目前为止所做的,但它看起来非常复杂!我错过了什么?应该是这样吗?

notes = [ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "b" ]
major = [2,2,1,2,2,2] # semitone steps
root = "f"
root_i= notes.index(root)

index = [root_i+i for i in [sum(major[:y]) for y in range(len(major)+1)]]
scale = [notes[i] if i < len(notes) else notes[i-len(notes)] for i in index]

我只需要在 major 中按每个“步骤”递增 root_i 并在到达 notes 末尾时重新启动...

谢谢。

最佳答案

一种方法是使用 deque,但是基于 list 的方法并没有什么错。我只是倾向于通过将它放在自己的函数中来让它更清楚地说明正在发生的事情......

from collections import deque

notes = [ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "b" ]

def get_scale(seq, start):
d = deque(seq)
d.rotate(-seq.index(start))
yield d[0]
for idx in [2, 2, 1, 2, 2, 2]:
d.rotate(-idx) # always bring element to index 0
yield d[0]

print list(get_scale(notes, 'c'))

然后,您不妨预先计算很多:

>>> scales = {k:list(get_scale(notes, k)) for k in notes}
>>> scales
{'a': ['a', 'b', 'c#', 'd', 'e', 'f#', 'g#'], 'c': ['c', 'd', 'e', 'f', 'g', 'a', 'b'], 'b': ['b', 'c#', 'd#', 'e', 'f#', 'g#', 'a#'], 'e': ['e', 'f#', 'g#', 'a', 'b', 'c#', 'd#'], 'd': ['d', 'e', 'f#', 'g', 'a', 'b', 'c#'], 'g': ['g', 'a', 'b', 'c', 'd', 'e', 'f#'], 'f': ['f', 'g', 'a', 'a#', 'c', 'd', 'e'], 'c#': ['c#', 'd#', 'f', 'f#', 'g#', 'a#', 'c'], 'd#': ['d#', 'f', 'g', 'g#', 'a#', 'c', 'd'], 'f#': ['f#', 'g#', 'a#', 'b', 'c#', 'd#', 'f'], 'g#': ['g#', 'a#', 'c', 'c#', 'd#', 'f', 'g'], 'a#': ['a#', 'c', 'd', 'd#', 'f', 'g', 'a']}
>>> scales['d']
['d', 'e', 'f#', 'g', 'a', 'b', 'c#']
>>> scales['c']
['c', 'd', 'e', 'f', 'g', 'a', 'b']

关于python循环索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13723303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com