转换字典中的列表列表,其中内部列表是键值对

时间:2014-08-15 06:22:34

标签: python list dictionary

我有一份清单清单:

[['a', 1],['b', 2]['c', 3]['c', 1]['c', 9]['d', 8]['d', 4]]

我想用:

制作一本字典
{ a:1, b:2, c:[3,1,9],d:[8,9]}

我尝试了以下内容:

count = 0
sw_fd_dict = {}
value_list =[]  
sw_fd_list2 = [['a', 1],['b', 2],['c', 3],['c', 1],['c', 9],['d', 8],['d', 4]]
while count < len(sw_fd_list2):
    try:
        # to check for repeated keys like "c"
        if sw_fd_list2[count][0] != sw_fd_list2[count-1][0]: 
            sw_fd_dict[sw_fd_list2[count][0]] = sw_fd_list2[count][1]

        elif sw_fd_list2[count][0] == sw_fd_list2[count-1][0]:
            value_list.append(sw_fd_list2[count-1][1])
            value_list.append(sw_fd_list2[count][1])
            sw_fd_list2[count][1] =value_list
            sw_fd_dict[sw_fd_list2[count][0]] = sw_fd_list2[count][1]

      except Exception as e:
          print str(e)
      count += 1
print sw_fd_dict

有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

这是一种较短的方法:

result = {}
for (key, value) in the_list:
    result.setdefault(key, []).append(value)

setdefault会返回该值(例如get),但如果它不存在则先设置它。 (defaultdict在这里也可以正常工作。)

在重新阅读问题时,如果你真的希望的单个数字是列表,你可以放入更多的条件。我对此进行了编辑以使用set,而不是检查现有值是否可附加,以便“安全”。如果您的值是集合而不是数字。

result = {}
seen = set()
for (key, value) in the_list:
    if key not in result:
        result[key] = value
    elif key not in seen:
        result[key] = [result[key], value]
        seen.add(key)
    else:
        result[key].append(value)

或者,将defaultdict风格的答案转换为不在列表中的单个数字的答案的好方法:

result = {
    key: value[0] if len(value) == 1 else value
    for key, value in result.items()}

答案 1 :(得分:2)

您可以在collections包中使用defaultdict

from collections import defaultdict
sw_fd_dict = defaultdict(list)
sw_fd_list2 =  [['a', 1],['b', 2], ['c', 3], ['c', 1], ['c', 9], ['d', 8], ['d', 4]]

for key, val in sw_fd_list2:
    sw_fd_dict[key].append(val)

sw_fd_dict

Out[8]: defaultdict(<type 'list'>, {'a': [1], 'c': [3, 1, 9], 'b': [2], 'd': [8, 4]})

然后将其转换为传统的dict

dict(sw_fd_dict)
Out[9]: {'a': [1], 'b': [2], 'c': [3, 1, 9], 'd': [8, 4]}

编辑: Quentin THEURET指出我没有复制你想要的确切结果。感谢他的评论,我注意到你需要将单个值作为一个整数,而不是包含在列表中。然后,您可以执行一些后处理:

d = dict(sw_fd_dict)
for k in d.keys():
    if len(d[k]) == 1:
        d[k] = d[k][0]
d
Out[15]: {'a': 1, 'b': 2, 'c': [3, 1, 9], 'd': [8, 4]}

答案 2 :(得分:1)

def list_to_dict(l):
    d = {}
    for key, val in l:
         if key in d:
             if isinstance(d[key], list):
                 d[key].append(val)
             else:
                 d[key] = [d[key], val]
         else:
             d[key] = val
    return d

sw_fd_list2 = [['a', 1],['b', 2],['c', 3],['c', 1],['c', 9],['d', 8],['d', 4]]
res = list_to_dict(sw_fd_list2)

答案 3 :(得分:0)

非常相似的问题:https://stackoverflow.com/a/960753/1317856

>>> l = [['a', 1],['b', 2]['c', 3]['c', 1]['c', 9]['d', 8]['d', 4]]
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for a, b in l:
    d[a].append(b)
>>> dict(d)
{'a': [1], 'c': [3, 1, 9], 'b': [2], 'd': [8, 4]}