【问题标题】:How to create a list comprehension based on generating lists of a given size with elements in a given range? [closed]如何基于生成具有给定范围内的元素的给定大小的列表来创建列表理解? [关闭]
【发布时间】:2021-06-11 00:04:48
【问题描述】:

给定两个参数:

  • dim子列表的长度
  • n 这个列表中每个元素的取值范围

我想生成一个列表列表,以便结果包含子列表的所有唯一组合(对于dimn

例如:

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


【解决方案1】:

您可以将列表推导与itertools.product 一起用作元组的生成器,以及在最终列表中包含或排除它们的任何过滤器。例如:

[item for item 
    in itertools.product(range(5), range(5)) # generate
    if item[0] != item[1]]                   # filter in/out

【讨论】:

  • 我很抱歉@DYZ,因为我看到你实际上非常接近foo(2, 5) 的答案。我希望我之前的问题不会导致有人对此表示反对。我赞成这个:-)
  • 这成功了。但是,我使用了product(range(n), repeat=dim)
【解决方案2】:

如果条件只是a != b != ...,那么只需简单地使用itertools.permutations

[i for i in permutations(range(n), dim)]

喜欢: [i for i in permutations(range(2), 2)] => [(0, 1), (1, 0)]

【讨论】:

  • 这不是我真正想要的。这是缺少 (0,0) 和 (1,1)
  • 这仅适用于您问题中的简单条件。如果你有其他条件,就用product方法吧。
猜你喜欢
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2013-09-09
  • 2012-01-06
  • 2018-04-17
  • 2019-06-01
  • 2019-06-24
  • 2015-04-05
相关资源
最近更新 更多