2013-12-07 58 views
1

我有一個元組列表函數生成dictionaires列表

[('color','blue'),('number',3),('place','usa'),('color','yellow'),('place','canada')...] 

我想建立一個能返回我dictionaires列表的功能

[{'color':blue, 'number':3, 'place':'usa'}, {'color':yellow, 'number':'', 'place':'camada'},...] 

功能必須創建一個新的dictionaire每次發現其中一個已經有一個賦值的鍵

在上面的例子中,當它迭代元組列表時, pty dictionaire用鍵和空值('') - 鍵總是相同的 - 並根據元組鍵來更新值。然後,當它到達一個已經具有指定值的鍵值('顏色','黃色')時,它將不得不創建另一個詞典並將顏色的值更新爲黃色,等等......

那麼函數將返回dictionaires列表...

我可以爲一個dictionaire做到這一點,但不知道如何使它創建一個新的和如何存放......在

謝謝提前任何幫助!

回答

4

我不能完全肯定我理解輸出你後,但也許像

def tups_to_dicts(kv_pairs): 
    # split into dictionaries 
    ds = [] 
    for key, val in kv_pairs: 
     if not ds or key in ds[-1]: 
      ds.append({}) 
     ds[-1][key] = val 
    # pad the empty values 
    all_seen_keys = set().union(*ds) 
    ds = [{key: d.get(key, '') for key in all_seen_keys} for d in ds] 
    return ds 

會讓你收什麼?它產生

>>> data = [('color','blue'),('number',3),('place','usa'),('color','yellow'),('place','canada'), ('color', 'orange'), ('sport', 'hockey')] 
>>> dd = tups_to_dicts(data) 
>>> for d in dd: 
...  print d 
...  
{'color': 'blue', 'sport': '', 'place': 'usa', 'number': 3} 
{'color': 'yellow', 'sport': '', 'place': 'canada', 'number': ''} 
{'color': 'orange', 'sport': 'hockey', 'place': '', 'number': ''} 
+0

謝謝!它幫助! – user2950162

0

嘗試list comprehensions

given = [('color', 'blue'), ('number', 3), ('place', 'usa'), 
     ('color', 'yellow'), ('number', 3), ('place', 'canada')] 

print [dict(given[i:i+3]) for i in range(0, len(given) - 2, 3)] 

輸出

[{'color': 'blue', 'place': 'usa', 'number': 3}, 
{'color': 'yellow', 'place': 'canada', 'number': 3}] 

注 - 必須有所有值元組這個工作,即你不能只color & number &跳過place in一些序列。訂單&分組在這裏很重要。