我有一組桶,每個桶中都有一定數量的項目。我想與每個存儲桶中的一個項目進行組合。循環應該保持不同的組合,直到每個項目至少參與了某個定義的數字。循環直到所有元素都被訪問了N次python
我可以很容易地看到如何運行循環並停止一次單個元素被訪問一定次數。然而,我無法看到如何設置最小截止點,而不是搜索所有存儲桶中的所有元素,以便在每次迭代循環後檢查其訪問數。
我有一組桶,每個桶中都有一定數量的項目。我想與每個存儲桶中的一個項目進行組合。循環應該保持不同的組合,直到每個項目至少參與了某個定義的數字。循環直到所有元素都被訪問了N次python
我可以很容易地看到如何運行循環並停止一次單個元素被訪問一定次數。然而,我無法看到如何設置最小截止點,而不是搜索所有存儲桶中的所有元素,以便在每次迭代循環後檢查其訪問數。
itertools.product
是單向的(一個非常系統的一個),該「組合」您請求(不當然.combinations
功能混淆) - 或者你可以用random.choose
從每個桶讓他們隨機;不知道哪一個是你的,因爲我不知道你的真正目的是什麼。
無論如何,我會跟蹤每個項目在dict中的組合數(或者每個桶中有一個詞典,如果桶中的項目可能有重疊)。或者,您可以在Python 2.7中使用collections.Counter,如果這是您的版本。
無論如何,做一件事的一種可能性是:當一件物品的數量達到N
時,從它的存儲桶(或所有存儲桶,如果存在重疊並且這是您需要的語義)中刪除該物品 - 除了如果這使桶保持空的狀態,則恢復桶的內容並標記爲「已完成」(你不需要從已完成的桶中移除項目),例如通過將桶的索引添加到一個集合中。
當所有桶完成時(無論是隨機的還是系統的),您都完成了。
需要一些代碼來解釋這個更好嗎?然後請指定重疊語義(如果重疊是可能的)以及您擁有的系統性或隨機性要求。
桶之間沒有重疊,所以random.choose選擇一個項目效果很好。使用項目作爲鍵和時間作爲值訪問的字典似乎很好。 @Vicki Laidler然後用min(dictionary.values())
@Fred,當然,如果你是在隨機抽樣之後,那麼檢查(在2.7中有一個'collections.Counter',在大多數版本中都是'collections.defaultdict(int)',只有在你堅持的時候纔是一個光禿的'dict'; - )是最能保持無偏隨機性的一種。 – 2010-07-21 20:51:21
嘗試
visits = defaultdict(int)
# do at each node visiting
visits[n] += 1
if visits[n] >= MAX_VISITS:
break
print 'done'
由於OP在詢問,這* * * * * * *每個*項目都會被訪問一定次數 - 只要**一個項目被多次訪問,就會退出,因爲OP說他已經知道該怎麼做! – 2010-07-17 04:01:52
似乎我誤讀了這條線。忽略答案。 – sharvey 2010-07-17 04:31:30
使用字典的項目,如鑰匙。每次使用該項目時,都要更新其數量。然後檢查一下所有的值是否至少超過閾值,即:
counter = dict()
while min(counter.values) < threshold:
# make a combination
# and update the dictionary
在香草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做這件事的方式。
聽起來像是作業問題,不是嗎? – cape1232 2010-07-17 03:38:06