【问题标题】:Keeping count of values available from among multiple sets保持对多个集合中可用值的计数
【发布时间】:2018-02-01 02:17:57
【问题描述】:

我有以下情况:

我正在生成 n 个大小为 3 的组合,由 n 个值组成。每个第 k 个组合 [0...n] 从一个值池中提取,位于 n 个集合列表的第 k 个索引中。每个值可以出现 3 次。因此,如果我有 10 个值,那么我有一个大小为 10 的列表。每个索引都包含一组 0-10 的值。

因此,在我看来,这样做的一个好方法是对所有集合中的所有可用值进行计数。所以,如果一个值是稀有的(假设只剩下 1 个),如果我有一个可以查找最稀有值的结构,并让结构告诉我它位于哪个索引中,那么它将生成可能的组合更容易。

我怎么能这样做?一个结构来保持元素计数,以及一个字典来跟踪包含该值的列表索引呢?

编辑:我想我应该在这里解决一个我想要解决的特定问题,即如何更新列表的每个索引(或我最终使用的任何其他结构)的集合,以便当我使用一个值 3 次,它对其他所有组合都不可用。

谢谢。

另一个编辑

当我什至很难理解我的要求时,这似乎有点过于抽象而无法要求解决方案。我很快就会回来提供一些代码,如果您有兴趣,请在 1.5-2 小时后回来查看。

【问题讨论】:

  • 您能添加一些代码以清楚起见吗?我想我遵循了你想要做的事情,但我并没有很好地想象你从什么开始。
  • 用 Guido 的话来说,“代码会说话。”
  • 我刚刚开始使用我的程序的这一部分。当我有一些代码时(肯定会在接下来的几个小时内),我会发布一些。

标签: python set combinations counter


【解决方案1】:

如何为列表的每个索引(或我最终使用的任何其他结构)更新集合,以便当我使用一个值 3 次时,它对所有其他组合都不可用。

我假设您想真正随机地对值进行采样,对吧?如果您将每个值中的 3 个放入一个列表中,使用random.shuffle 对其进行随机播放,然后在构建组合时继续从列表末尾弹出值,该怎么办?如果我理解你的问题是正确的,这里是示例代码:

from random import shuffle
valid_values = [i for i in range(10)] # the valid values are 0 through 9 in my example, update accordingly for yours
vals = 3*valid_values # I have 3 of each valid value
shuffle(vals) # randomly shuffle them
while len(vals) != 0:
    combination = (vals.pop(), vals.pop(), vals.pop()) # combinations are 3 values?
    print(combination)

编辑:根据您拥有一组值的附加信息更新代码(但这仍然假设您可以使用给定集合中的多个值):

from random import shuffle
my_sets_of_vals = [......] # list of sets
valid_values = list()
for i in range(my_sets_of_vals):
    for val in my_sets_of_vals[i]:
        valid_values.append((i,val)) # this can probably be done in list comprehension but I forgot the syntax
vals = 3*valid_values # I have 3 of each valid value
shuffle(vals) # randomly shuffle them
while len(vals) != 0:
    combination = (vals.pop()[1], vals.pop()[1], vals.pop()[1]) # combinations are 3 values?
    print(combination)

【讨论】:

  • 很好,这也是我想象的解决方案。
  • 不是随机的,因为每个组合都是由一组特定的值组成的。设置 0(我的第一个组合),可能有 (1,5,9,14,11,28)。并设置 n(我的最后一个组合),可能有 (0,1,11,16,3) - 例如。
  • @TravisBlack 我想我们并没有真正理解你的问题。你能至少提供一些伪代码吗?
  • 不过,您可以简单地修改我的代码以应用于您的代码。您所要做的就是修改valid_values 的创建方式。例如,它不仅是整数,还可以是 (set_number,value) 元组,当你弹出值时,你会使用 vals.pop()[1] 而不是 vals.pop()
【解决方案2】:

根据编辑,您可以为每个值创建一个对象。它可以保存您使用元素和元素本身的次数。当你发现你已经使用了一个元素 3 次时,将其从列表中删除

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2021-07-19
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多