簡體   English   中英

查找列表中的所有對,條件為 Python

[英]Find all the pairs in a list with conditions Python

我有一個現實生活中的問題,我想使用 Python 來解決。 我有一個由 x=10 人組成的團隊(包括我自己),在 n-1=9 周期間,我們希望每周安排一次 1 對 1 通話,這樣每個人都可以接到每個人的電話,並且在此期間沒有一對人交談兩次9 周。

這是我的解決方案,但它有缺陷,因為盡管每個人都與每個人交談,但每個人每周都有兩個電話,而我每周只需要 1 個電話。

知道我該如何解決這個問題嗎?

#for shifting a list to the left with n positions
def rotate(l, n):
    return l[n:] + l[:n]

def generate_1on1_meetings(members):
    random.shuffle(members)
    n = len(members)
    for i in range(0, int(n / 2)):
        print("WEEK " + str(i + 1) + "\n")
        aux = rotate(members, i + 1)
        for j in range(0, n):
            print(members[j] + " - " + aux[j])
        print("\n")

編輯:所以為了讓事情更清楚,應該有偶數(2k)人。 每周將有 k 次會議,每個人只出現在一次會議中,並且每周每個人都將參加一次會議。 召開所有會議需要 2k-1 周。

示例:讓我們考慮 4 個團隊成員的情況:[A, B, C, D]。 考慮到我的限制,一個解決方案是:

第1周:AB,CD

第 2 周:AC、BD

第 3 周:公元,公元前

所以每個人每周只有一次會議,他們每周只參加一次會議,4-1周過去后,每個人都和每個人開會

您可以使用循環(多邊形)算法:

這是 Python 中的算法示例(適用於偶數和奇數的團隊/人):

def roundRobin(T):
    P = T[1:]+len(T)%2*[None]
    for _ in range(len(T)-1):
        yield [g for g in zip(T[:1]+P[1:len(P)//2+1],P[:1]+P[::-1])]
        P.append(P.pop(0))

output:

# Even number of people (10)

for calls in roundRobin(["A","B","C","D","E","F","G","H","I","J"]):
    print(calls) 

[('A', 'B'), ('C', 'J'), ('D', 'I'), ('E', 'H'), ('F', 'G')]
[('A', 'C'), ('D', 'B'), ('E', 'J'), ('F', 'I'), ('G', 'H')]
[('A', 'D'), ('E', 'C'), ('F', 'B'), ('G', 'J'), ('H', 'I')]
[('A', 'E'), ('F', 'D'), ('G', 'C'), ('H', 'B'), ('I', 'J')]
[('A', 'F'), ('G', 'E'), ('H', 'D'), ('I', 'C'), ('J', 'B')]
[('A', 'G'), ('H', 'F'), ('I', 'E'), ('J', 'D'), ('B', 'C')]
[('A', 'H'), ('I', 'G'), ('J', 'F'), ('B', 'E'), ('C', 'D')]
[('A', 'I'), ('J', 'H'), ('B', 'G'), ('C', 'F'), ('D', 'E')]
[('A', 'J'), ('B', 'I'), ('C', 'H'), ('D', 'G'), ('E', 'F')]


# Odd number of people (7) 

for calls in roundRobin(["A","B","C","D","E","F","G"]):
    print(calls)

[('A', 'B'), ('C', None), ('D', 'G'), ('E', 'F')] # C sits out
[('A', 'C'), ('D', 'B'), ('E', None), ('F', 'G')] # E sits out
[('A', 'D'), ('E', 'C'), ('F', 'B'), ('G', None)] # G sits out
[('A', 'E'), ('F', 'D'), ('G', 'C'), (None, 'B')] # B sits out
[('A', 'F'), ('G', 'E'), (None, 'D'), ('B', 'C')] # D sits out
[('A', 'G'), (None, 'F'), ('B', 'E'), ('C', 'D')] # F sits out

讓我們先安排對。 然后安排會議。

例子:

  1. 3 人團隊有 3x2 = 6 對 (1:1)
  2. 要安排 6 次會議,每周一次會議,我們需要 6 周

使用itertools.combinations

import itertools

def arrange_pairs(members):
    # 1:1 combinations, return a list of tuples (1:1 pair)
    return list(itertools.combinations(members,2))  # combine pairs (r=2) of members


def schedule_meetings(pairs):
    # 1 meeting per week, return a list of meeting-descriptions as string
    scheduled = []
    cw = 1  # calendar week or just a counter
    for pair in pairs:
        scheduled.append(f"week {cw:2}: {pair}")
        cw = cw + 1
    return scheduled


members = [1,2,3]  # given 3 team-members, simplified as numerical ID
pairs = arrange_pairs(members)
meetings = schedule_meetings(pairs)
print(meetings)

印刷:

['week  1: (1, 2)', 'week  2: (1, 3)', 'week  3: (2, 3)']

另請參閱: 如何獲取列表元素的所有可能組合?

暫無
暫無

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

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