另一編輯: 我想我可能沒有提出足夠清晰的問題。每個Person
都有一個可以執行哪些任務的單獨列表,並且不能保證Person1
將始終具有列表中的三個任務中的第一個。我已經嘗試了幾個建議的答案,但都沒有得到我期待的結果。使用zip
和dict
只會檢查使用Person
對象的組合,它們與它們在列表中出現的順序相同,這會給我一些不正確的答案。使用itertools.combinations
解決了這個問題,但測試了每個可能的人員任務組合,這再次給了我一堆我不想要的組合。Python - 用於迭代的兩個列表中的每個列表的三個項目的組合
我想最終實現是有一個包含三個tasks
所有集合不能被分配一個task
每個person
覆蓋的列表bad_options
。我不需要每個排列組合(例如,如果三個tasks
是[Task1, Task3, Task6]
和Person1, Person3, Person2
都按順序排列,我不希望[Task1, Task3, Task6]
被添加到bad_options
。如果這還不夠清楚,我會提前道歉;如果在此。一點我應該問一個新問題,基於下面的答案隨意評論和這麼說,我會走這條路
,我已經試過:
for setup in setups:
combo = dict(zip(setup, people))
possibilities.append(combo)
for setup in possibilities:
for task, person in setup.items():
if not task in person.tasks:
if not setup in bad_options:
bad_options.append(setup)
break
else:
pass
這是返回所有的可能的任務組合,就好像它們都沒有被覆蓋,即使當我直接設置每個person.tasks
以確保它們都應該是有效的並且該函數應該返回沒有。我現在做錯了什麼?
我有我需要結合以下:
tasks = ['Task1', 'Task2', 'Task3', 'Task4', 'Task5', ...]
people = [Person1, Person2, Person3]
每個Person
是一個類的實例,其屬性之一,是這個人能夠執行的任務列表。我將不得不分配三個總任務,每個人一個。我想確保三種任務的所有可能的組合都可以由可用的人員覆蓋。
我已經建立,這將使我的三個任務的所有可能組合的列表代碼:
setups = (('Task1', 'Task2', 'Task3'),
('Task1', 'Task2', 'Task4'),
('Task1', 'Task2', 'Task5'), ...)
(原因我做這個部分分別是,因爲也有上的哪些組合限制任務可以放在一起,我已經編寫了一個單獨的腳本來消除非法組合,我不希望重複這種努力,但如果這樣做是愚蠢的,可以這樣做)。
我想我需要一個使用for
循環超過setups
,也許有類似itertools.combinations
?我會尋找的結果是一個列表的清單,如在:
options = [['Task1' : Person1, 'Task2' : Person2, 'Task3' : Person3],
['Task1' : Person1, 'Task2' : Person2, 'Task4' : Person3], ...]
我迷失在如何獲得該列表的字典。我假設迭代在列表上會是這樣的:
for option in options:
for task, person in option.items():
if task[0] in person[0].tasks and task[1] in person[1].tasks and task[2] in person[2].tasks:
True
else:
bad_options.append(option)
bad_options
然後將未蓋好的任務組合的列表,如果有的話,對不對?底線問題:我如何得到該列表的字典,並且是我的代碼來正確地迭代它?另外,我很樂意被告知有更好的方法來實現這個目標。爲了獲得額外的信用,我將在未來從確定哪些任務要訓練每個人的方式中受益,以便他們能夠覆蓋所有可能性(但如果不清楚,或者您可以回答第一個問題而不是這個問題,請忽略此問題)。
我認爲這樣做,但我碰到另一個問題,我認爲我知道如何處理,所以我不能測試它。 – Zack
這似乎很有希望,但顯然我仍然缺少一些東西。我無法將我編輯的代碼放入評論中,因此很快就會對OP進行編輯。 – Zack