如何解决如何基于使用给定范围内的元素生成给定大小的列表来创建列表理解?
给定两个参数:
-
dim
子列表的长度 -
n
此列表的每个元素可能采用的值范围
我想生成一个列表列表,以便结果包含子列表的所有唯一组合(对于 dim
和 n
)
例如:
dim = 3
n = 2
我要生成:
[
[0,0],[0,1],1,[1,1]
]
对于:
dim = 2
n = 3
我要生成:
[
[0,2],[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`”的形式上。
这段代码的目标是创建一个函数,它可以接收像吉他这样的有品乐器,接收弦的数量、它们的调音和一个和弦,然后它应该吐出可能的指法方式。但是,我担心性能,因为我想处理至少 6 个带有 12 个不同音符的弦。但这是一个我以后会担心的问题。
所以完整的样本可能是这样的。 tuning
只是一个列表,其中大小是字符串的数量,元素是调整。而 chord
是某种定义有效输出的结构。
>>> get_fingerings(tuning,chord)
[[6,6,4,3,3]]
解决方法
您可以使用带有 itertools.product
的列表推导作为元组的生成器和任何过滤器以将它们包含或排除在最终列表中。例如:
[item for item
in itertools.product(range(5),range(5)) # generate
if item[0] != item[1]] # filter in/out
,
如果条件只是a != b != ...
,那么只需简单地使用itertools.permutations
:
[i for i in permutations(range(n),dim)]
喜欢:
[i for i in permutations(range(2),2)]
=> [(0,1),(1,0)]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。