【发布时间】:2021-06-11 00:04:48
【问题描述】:
给定两个参数:
-
dim子列表的长度 -
n这个列表中每个元素的取值范围
我想生成一个列表列表,以便结果包含子列表的所有唯一组合(对于dim 和n)
例如:
dim = 3
n = 2
我要生成:
[
[0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]
]
为:
dim = 2
n = 3
我要生成:
[
[0, 0],
[0, 1],
[0, 2],
[1, 0],
[1, 1],
[1, 2],
[2, 0],
[2, 1],
[2, 2]
]
我试过了:
[[a,b] for a in range(dim) for b in range(n)]
但这并不完全正确。一段时间以来,我一直在为此挠头。我只是不知道该怎么做。
注意,我假设列表推导是要走的路。也欢迎其他方法。但我认为列表推导是一个好方法,因为我稍后会添加更多限制。喜欢
[[a,b] for a in range(dim) for b in range(n) if a!=b]
最后一个条件a!=b 是一个非常简单的条件。实际上,它们会更多地出现在“如果a 属于这个集合,而b 属于另一个集合并且ab+4`”的形式上。
此代码的目标是创建一个函数,该函数可以接收像吉他这样的按弦乐器,接收弦数、它们的调音和和弦,然后它应该吐出可能的指法方式。但是,我担心性能,因为我想处理至少六个带有十二个不同音符的弦。但这是我以后会担心的问题。
所以完整的样本可能是这样的。 tuning 只是一个列表,其中大小是字符串的数量,元素是调整。而chord 是某种定义有效输出的结构。
>>> get_fingerings(tuning, chord)
[[6,6,4,3,0,0], [1,3,0,0,3]]
【问题讨论】:
-
你必须用列表理解来做吗?我敢打赌
itertools中有一个函数可以为您完成。 -
完成
itertools上的教程;你['正在要求product方法。 -
@Barmar 我澄清了
-
所以你想要一个函数
foo(dim, n)使得foo(3,2)产生[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]对吗?结果中的每个子列表的长度都是“dim”,每个值都在n范围内,对吗? -
@JonSG 没错。
标签: python python-3.x list list-comprehension