2017-11-18 24 views
2

我有兩個列表,需要將它們合併成一個字典,其中鍵是字母,值是另一個列表中的值。 例如:如何在python中使用字典組合其他列表中的項目的所有值?

map_keys_to_values_list(["a", "b", "a"], [15, 3, 6]) 

無線本地環路給我:

{'a': [15, 6], 'b': [3]} 

我想:

def keys_to_values_list(k_lst, v_lst): 
    lst = [] 
    for i in range(len(k_lst)): 
     v=[] 
     #v.append(v_lst[i]) 
     t = (k_lst[i],v) 
     lst.append(t) 
    my_dict = dict(lst) 
    for k in my_dict.keys(): 
     val = my_dict.get(k) 
     for m in range(len(k_lst)): 
      val.append(v_lst[m]) 


    return my_dict 

,但我得到了我的價值列表中的所有值

回答

2
def keys_to_values_list(keys, values): 
    d = dict() 
    for i in range(len(keys)): 
     if keys[i] in d: 
      d[keys[i]].append(values[i]) 
     else: 
      d[keys[i]] = [values[i]] 
    return d 
4

你可以使用collections.defaultdict合格出廠默認爲list收集所有屬於同一性質的值:

from collections import defaultdict 

def map_keys_to_values_list(keys, values): 
    d = defaultdict(list) 
    for k, v in zip(keys, values): 
     d[k].append(v) 
    d.default_factory = None 
    return d 

建立字典後,您可以在字典的default_factory設置爲None,以便進一步鍵訪問不產生新列表丟失的鑰匙,而是會提高更合適KeyError

>>> d = map_keys_to_values_list(["a", "b", "a"], [15, 3, 6]) 
>>> d 
defaultdict(None, {'a': [15, 6], 'b': [3]}) 
>>> d['c'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'c' 
+0

設置default_factory爲無相反的,爲什麼不直接調用字典(d),並返回一個純粹的字典? –

+0

@EnricoBorba不,我不會那樣做。這將創建一個新的* vanilla * dict對象,這對於大型字典來說可能相當昂貴。與'dict(d)'相比,將'default_factory'設置爲'None'非常便宜。 'd'已經是一個字典子類實例。 –

0

試試這個太:

def mapKeysToValues(keyList, valueList): 
    return {k : [value for index, value in enumerate(valueList) if keyList[index]==k] for k in keyList} 

keyList = ["a", "b", "a"] 
valueList = [15, 3, 6] 

print(mapKeysToValues(keyList, valueList)) 

輸出:

{'a': [15, 6], 'b': [3]} 
相關問題