簡體   English   中英

將項目列表隨機分組,但某些項目不能在同一組中

[英]Group list of items randomly, but some items cannot be in same group

我有一個要放入n個組的名稱列表。 我可以輕松做到。 但是,我的問題是,某些項目無論如何都無法組合在一起。 有一個簡單的解決方案嗎?

我現在是這樣的:

import random

name_list = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"]
n = 2

random.seed(4)
random.shuffle(name_list)

test = [name_list[i:i + n] for i in xrange(0, len(name_list), n)]

print(test)

因此,從中,我將得到隨機分組的4個組,最后一組中只有1個(沒關系)。 但是,假設Item1Item5不能一起結束。 我要如何點呢?

在這里,我們得到了隨機分配的物品的組或“塊”。

給定

import random
import itertools as it

import more_itertools as mit


random.seed(4)
n = 2
name_list = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"]
blacklist = ["Item1", "Item5"]

def get_random_groups(lst, size=2, blacklist=None):
    """Return distributed items among `m` groups of lists."""
    if blacklist is None:
        blacklist = []

    # Compute number of chunks
    length = (len(lst))
    if length % 2 == 0:
        m = length//size
    else:
        m = (length+1)//size

    # Edge cases
    if len(blacklist) > m:
        raise ValueError("Black-list is too long.  Must be < number of chunks.")
    if not set(blacklist).issubset(set(lst)):
        raise ValueError("Black-list is not a subset of the main list.")

    # Resize list
    remnant_list = list(set(lst) - set(blacklist))
    random.shuffle(remnant_list)

    # Build chunks and distribute (blacklist first)
    chunks = [list(c) for c in mit.distribute(m, blacklist)]
    random.shuffle(chunks)

    for chunk in chunks[:]:
        while len(chunk) < size:
            try:
                chunk += [remnant_list.pop(-1)]
            except IndexError:
                return chunks

演示版

# Without blacklist
get_random_groups(name_list, size=n)
# Out: [['Item5', 'Item1'], ['Item3', 'Item6'], ['Item7', 'Item2'], ['Item4']]

# With blacklist
get_random_groups(name_list, size=n, blacklist=blacklist)
# [['Item2', 'Item6'], ['Item1', 'Item3'], ['Item5', 'Item7'], ['Item4']]

# Invalid blacklist
blacklist = "Item1 Item3 Item 5 Item6 Item7".split()  
get_random_groups(name_list, size=n, blacklist=blacklist)
# ValueError: Blacklist is too long.  Must be < number of chunks.

# Invalid blacklist
blacklist = "Item1 Item9".split()  
get_random_groups(name_list, size=n, blacklist=blacklist)
# ValueError("Black-list is not a subset of the main list.")

細節

  • 塊的數量是根據偶數或奇數長度的列表計算的。
  • 邊緣盒已經過測試(可選)。
  • blacklist項目將首先在大塊之間分配。 因此,必須從其余元素列表( remnant_list )中刪除這些項目。
  • more_itertools.distribute是一種第三方工具,可促進在m個塊之間進行 分配分配 您可以選擇實現自己的算法來完成這兩項任務。
  • 除非滿足塊的size ,否則將隨機余項添加到隨機的塊中。 這種雙重改組可確保物品隨機放置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM