2017-11-18 68 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]} 
相关问题