我有一组水桶,每个水桶都有一定数量的物品。我想与每个桶中的一个项目组合。循环应该保持不同的组合,直到每个项目参与至少一些定义的数字。
我可以很容易地看到如何运行循环并在访问单个元素一定次数后停止。但是,我无法看到如何设置最小截止点,除了搜索所有桶中的所有元素,以便在循环的每次迭代后检查它们的访问号。
答案 0 :(得分:1)
itertools.product
是一种方式(一种非常系统的方式)来制作你要求的“组合”(当然不要与.combinations
函数混淆) - 或者你可以随机制作它们来自每个桶的random.choose
;不知道哪一个适合你,因为我不知道你的真正目的是什么。
无论如何,我会跟踪每个项目用dict进行多少个组合(或者每个桶有一个dict,如果桶中的项目可能有重叠)。或者,您可以在Python 2.7中使用collections.Counter,如果这是您的版本。
无论如何,做出你要求的一种可能性是:项目计数达到N
的那一刻,从其桶中删除该项目(或所有桶,如果有重叠,那就是你需要的语义) - - 除非如果将铲斗留空,请恢复铲斗的内容并将其标记为“已完成”(您不需要从已完成的铲斗中移除物品),例如通过将桶的索引添加到集合中。
当所有桶都完成时(无论是随机还是系统),您就完成了。
需要一些代码来更好地解释一下吗?然后请指定重叠语义(如果可能重叠)以及您具有的系统或随机要求。
答案 1 :(得分:0)
试
visits = defaultdict(int)
# do at each node visiting
visits[n] += 1
if visits[n] >= MAX_VISITS:
break
print 'done'
答案 2 :(得分:0)
使用包含项目作为键的字典。每次使用该项目时,请更新其计数。然后检查所有值是否至少高于阈值,即:
counter = dict()
while min(counter.values) < threshold:
# make a combination
# and update the dictionary
答案 3 :(得分:0)
在vanilla Python中,这似乎可以完成这项工作:
buckets = [ [1,2,3],[4],[5,6],[7,8,9,0] ]
def combo(b, i = 0, pref = []):
if len(b) > i:
c = b[i]
for v in c:
combo(b, i + 1, pref + [v])
else:
print pref
combo(buckets)
输出:
[1, 4, 5, 7]
[1, 4, 5, 8]
[1, 4, 5, 9]
[1, 4, 5, 0]
[1, 4, 6, 7]
[1, 4, 6, 8]
[1, 4, 6, 9]
[1, 4, 6, 0]
[2, 4, 5, 7]
[2, 4, 5, 8]
[2, 4, 5, 9]
[2, 4, 5, 0]
[2, 4, 6, 7]
[2, 4, 6, 8]
[2, 4, 6, 9]
[2, 4, 6, 0]
[3, 4, 5, 7]
[3, 4, 5, 8]
[3, 4, 5, 9]
[3, 4, 5, 0]
[3, 4, 6, 7]
[3, 4, 6, 8]
[3, 4, 6, 9]
[3, 4, 6, 0]
毫无疑问,有更多的Pythonic方式。