2013-12-07 53 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一些序列。订单&分组在这里很重要。