[英]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
讓我們先安排對。 然后安排會議。
例子:
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.