Python 如何将包含重复值的列表转换为以列表为值的字典?

Python 如何将包含重复值的列表转换为以列表为值的字典?,python,list-comprehension,Python,List Comprehension,假设我有两个由另一个函数生成的列表: test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]] test2 = [[1, 4], [4, 1]] 我想将它们转换为关联数组以进行快速查找,如下所示: test: {0: [1, 2], 1: [5,6], 2: [0], 3: [99, 98, 97]} test2: {1: [4], 4: [1]} 我可以这样做: def list_to_dict(my

假设我有两个由另一个函数生成的列表:

test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]
test2 = [[1, 4], [4, 1]]
我想将它们转换为关联数组以进行快速查找,如下所示:

test: {0: [1, 2], 1: [5,6], 2: [0], 3: [99, 98, 97]}
test2: {1: [4], 4: [1]}
我可以这样做:

def list_to_dict(my_list):
    last_val = my_list[0][0]
    temp = []
    my_dict = {}

    for i in my_list:
        if last_val == i[0]:
            temp.append(i[1])
        else:
            #add the values to this key
            my_dict[last_val] = temp
            #reset the list
            temp = []
            temp.append(i[1])

        last_val = i[0]
    my_dict[last_val] = temp
    return my_dict
    def list_to_dict(my_list):
        d = {}

        for pair in my_list:
            first = pair[0]
            second = pair[1]
            if first not in d:
                d[first] = []
            d[first].append(second)
        return d
但是,这不是很像蟒蛇。有没有一种更像蟒蛇的方法来实现这一点?

使用:

测试=[[0,1]、[0,2]、[1,5]、[1,6]、[2,0]、[3,99]、[3,89]、[3,79]] >>> >>>从集合导入defaultdict >>>d=默认DICT(列表) >>> >>>对于试验中的i,j: ... d[i].附加(j) ... >>>d defaultdict(,{0:[1,2],1:[5,6],2:[0],3:[99,89,79]})
这似乎是
itertools的完美用例。groupby

test = [[0, 1], [0, 2], [1, 5], [1,6], [2, 0], [3, 99], [3, 89], [3, 79]]

import itertools
d = {k:[t[1] for t in g] for k,g in itertools.groupby(test, key=lambda t: t[0])}

print(d)
请注意,
groupby
适用于iterables,默认情况下,它返回一个
grouper
对象。结果如下:

{0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}

您也可以通过字典分组来实现这一点,如:

def list_to_dict(my_list):
    last_val = my_list[0][0]
    temp = []
    my_dict = {}

    for i in my_list:
        if last_val == i[0]:
            temp.append(i[1])
        else:
            #add the values to this key
            my_dict[last_val] = temp
            #reset the list
            temp = []
            temp.append(i[1])

        last_val = i[0]
    my_dict[last_val] = temp
    return my_dict
    def list_to_dict(my_list):
        d = {}

        for pair in my_list:
            first = pair[0]
            second = pair[1]
            if first not in d:
                d[first] = []
            d[first].append(second)
        return d
如果密钥不可用,也可以使用setdefault()

    def list_to_dict(my_list):
        d = {}
        for pair in my_list:
            d.setdefault(pair[0], []).append(pair[1])
        return d

    # Output 

    {0: [1, 2], 1: [5, 6], 2: [0], 3: [99, 89, 79]}
如果您愿意,可以很容易地使用defaultdict对这些进行操作