2015-11-27 23 views
0

另一編輯: 我想我可能沒有提出足夠清晰的問題。每個Person都有一個可以執行哪些任務的單獨列表,並且不能保證Person1將始終具有列表中的三個任務中的第一個。我已經嘗試了幾個建議的答案,但都沒有得到我期待的結果。使用zipdict只會檢查使用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然後將未蓋好的任務組合的列表,如果有的話,對不對?底線問題:我如何得到該列表的字典,並且是我的代碼來正確地迭代它?另外,我很樂意被告知有更好的方法來實現這個目標。爲了獲得額外的信用,我將在未來從確定哪些任務要訓練每個人的方式中受益,以便他們能夠覆蓋所有可能性(但如果不清楚,或者您可以回答第一個問題而不是這個問題,請忽略此問題)。

回答

0

您可以使用zip()dict()

options = [] 

for tasks in setup: 
    d = dict(zip(tasks, [Person1, Person2, Person3])) 
    # {'Task1' : Person1, 'Task2' : Person2, 'Task3' : Person3} 

    options.append(d) 

在你的代碼taskperson是單一的元素,而不是名單 - 你不能使用[0][1]等。

但你可以做(​​使用for/break/else建設)

for option in options: 
    for task, person in option.items(): # single elements 
     if task not in person.tasks: 
      bad_options.append(option) 
      break 
    else: # for/break/else construction 
     print "OK:", option 
+0

我認爲這樣做,但我碰到另一個問題,我認爲我知道如何處理,所以我不能測試它。 – Zack

+0

這似乎很有希望,但顯然我仍然缺少一些東西。我無法將我編輯的代碼放入評論中,因此很快就會對OP進行編輯。 – Zack

1

不知道,但也許這就是你所需要的(如果我們的問題是如何獲得http://stardict.sourceforge.net/Dictionaries.php下載列表)

>>> import itertools 
>>> tasks = ['Task1', 'Task2', 'Task3', 'Task4', 'Task5'] 
>>> people = [1, 2, 3] 
>>> setups = itertools.combinations(tasks, len(people)) 
>>> options = [{task: person for task, person in zip(tasks, people)} for tasks in setups] 
>>> options 
[{'Task1': 1, 'Task2': 2, 'Task3': 3}, {'Task1': 1, 'Task2': 2, 'Task4': 3}, {'Task1': 1, 'Task2': 2, 'Task5': 3}, {'Task1': 1, 'Task3': 
2, 'Task4': 3}, {'Task1': 1, 'Task3': 2, 'Task5': 3}, {'Task1': 1, 'Task4': 2, 'Task5': 3}, {'Task2': 1, 'Task3': 2, 'Task4': 3}, {'Tas 
k2': 1, 'Task3': 2, 'Task5': 3}, {'Task2': 1, 'Task4': 2, 'Task5': 3}, {'Task3': 1, 'Task4': 2, 'Task5': 3}] 
+0

這不是我正在尋找的東西,但可以很容易地修改,以做我想做的。我希望Person對象本身在字典中,而不僅僅是與它們相關的數字。 – Zack

+0

嗯,我用數字做了這個例子,因爲我沒有你的Person類代碼。當然我期望,你會用Person對象來製作它。 – VadimK

0

你可以使用以下方法:

class Person(object): 
    def __init__(self, id): 
     self.id = id   # assign a simple ID to each Person 

Person1 = Person(1) 
Person2 = Person(2) 
Person3 = Person(3) 

people = [Person1, Person2, Person3] 

setups = (
    ('Task1', 'Task2', 'Task3'), 
    ('Task1', 'Task2', 'Task4'), 
    ('Task1', 'Task2', 'Task5')) 

# Create a list of dictionaries combining each setup with people 
options = [dict(zip(setup, people)) for setup in setups] 

# Display the list 

for option in options: 
    for key, person in option.items(): 
     print key, person.id 
    print 

這會給你以下g輸出:

Task1 1 
Task2 2 
Task3 3 

Task1 1 
Task2 2 
Task4 3 

Task1 1 
Task2 2 
Task5 3 
相關問題