Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python,列出所有不包含极端音程的k音和弦_Python_List - Fatal编程技术网

使用python,列出所有不包含极端音程的k音和弦

使用python,列出所有不包含极端音程的k音和弦,python,list,Python,List,我正在构建一个音乐教练游戏,在12个音高等级[C、CD、D、DE、E、F、FG、G、GA、a、AB、B]之后,每个等级都用[0到11]表示,和弦是这些数字的列表,所以CEG应该是[0,4,7] 通过观察差异,我们得到了区间:[4-0=4,7-4=3],因此[4,3],在这种情况下,小三分之一叠加在大三分之一之上 假设我有一个完整的k音和弦列表,可以通过以下方式形成: pitchClasses = [i for i in range(12)] from itertools import comb

我正在构建一个音乐教练游戏,在12个音高等级[C、CD、D、DE、E、F、FG、G、GA、a、AB、B]之后,每个等级都用[0到11]表示,和弦是这些数字的列表,所以CEG应该是[0,4,7]

通过观察差异,我们得到了区间:[4-0=4,7-4=3],因此[4,3],在这种情况下,小三分之一叠加在大三分之一之上

假设我有一个完整的k音和弦列表,可以通过以下方式形成:

pitchClasses = [i for i in range(12)]

from itertools import combinations
deck = list( combinations(pitchClasses, k) )
我如何修剪我的甲板,以拒绝任何和弦包含间隔q

比如说,我设定p=3,q=4。然后[C,D,G]被排除,因为它是[0,2,7],有[2,5]和24个间隙,所以它被排除在两个计数上

[B,C]也会被排除,因为[11,0]->[1]的间隙

CEG不会被排除在外 ; 它有缺口[4,3]。G和C之间也有7的间隙,但这并不构成拒绝

如果一个三音和弦能产生三个音隙的“双音”,那就更干净了。因为环绕间隙可能不是最大的间隙

然后,最小的元素可以与p相比较,第二大元素可以与q相比较

我认为我需要创建“双重”差距列表,首先将其排序为最小值,然后比较:

if W[0] < p or W[-2] > q:
    # reject
如果W[0]q:
#拒绝
我在C#中完成了这项工作,并产生了大量代码

有什么方法可以在Python中简洁地实现这一点吗

到目前为止,我发现:


到目前为止,我的代码如下所示:

from random import shuffle
from itertools import combinations

pitchClasses = [i for i in range(12)]

deck = list( combinations(pitchClasses, notesInChord) )

def GapOk(chord,min_gap,max_gap):
    gaps = [ ( 12 + chord[i+1]-chord[i] ) % 12  for  i in range(len(chord)) ]
    intervals = sorted( gaps )
    return intervals[0] >= min_gap  and  intervals[-2] <= max_gap

deck_pruned = [ chord for chord in deck if GapOk(chord,min_gap,max_gap) ]

shuffle( deck_pruned )
来自随机导入洗牌
从itertools导入组合
pitchClasses=[i代表范围内的i(12)]
甲板=列表(组合(沥青等级、注释和弦))
def GapOk(弦、最小间隙、最大间隙):
间距=[(12+和弦[i+1]-和弦[i])%12表示范围内的i(len(和弦))]
间隔=已排序(间隙)

返回间隔[0]>=min\u间隔和间隔[-2]我将尝试代码检查:

# prefer to use full paths for people less familiar
# from random import shuffle 
# from itertools import combinations # with your libs
import random
import itertools 


# pitchClasses = [i for i in range(12)] # just materialize into list:
# _ preferred to camelcase for non-native-English readers
pitch_classes = list(range(12)) 

# no need for extra spaces inside container chars, format like English
# deck = list(itertools.combinations(pitchClasses, notesInChord))
# maybe 3, 4, & 5 note chords?
chord_numbers = (3, 4, 5)  
deck = []
for notes_in_chord in chord_numbers:
    deck.extend(itertools.combinations(pitch_classes, notes_in_chord))

def GapOk(chord, min_gap, max_gap):
    # not sure what you're doing here, so I'll leave off for now, revisit later
    # for now, suggest docstring with explanation
    gaps = [(12 + chord[i+1]-chord[i]) % 12 for i in range(len(chord))]
    intervals = sorted(gaps)
    return intervals[0] >= min_gap and intervals[-2] <= max_gap

deck_pruned = [chord for chord in deck if GapOk(chord, min_gap, max_gap)]

random.shuffle(deck_pruned)
#喜欢为不太熟悉的人使用完整路径
#从随机导入洗牌
#从itertools导入组合#和您的LIB
随机输入
进口itertools
#pitchClasses=[i代表范围内的i(12)]#只是具体化到列表中:
#_u非英语母语读者优先选择camelcase
音高等级=列表(范围(12))
#容器字符内不需要额外的空格,格式如英语
#甲板=列表(itertools.组合(沥青等级、注释和弦))
#也许是3、4和5个音符的和弦?
弦_数=(3,4,5)
甲板=[]
对于音符_in_chord in chord_编号:
甲板延伸(itertools.组合(音高等级,和弦中的音符))
def GapOk(弦、最小间隙、最大间隙):
#我不知道你在这里干什么,所以我暂时不谈了,以后再谈
#现在,建议使用带有解释的docstring
间距=[(12+和弦[i+1]-和弦[i])%12表示范围内的i(len(和弦))]
间隔=已排序(间隙)

返回间隔[0]>=min_gap和间隔[-2]最好迁移到代码审查中,这绝对是正确的做法。我还没有使用过代码审查——我现在就开始使用它。我不确定是否可以迁移我自己的问题,或者是否应该关闭它并复制/粘贴。我标记了它,并请版主迁移它,我认为这是可行的。@Pi:CR mod here。您只是在问如何更简洁地编写当前代码,对吗?从某些措辞来看,听起来好像你在要求额外的实施。我们只能在编写工作代码时对其进行检查,因此如果在这里是这样,我将迁移它。