从列表列表构建字典并维护元素的位置

时间:2014-02-07 14:52:16

标签: python list dictionary

我正在尝试从列表列表中构建字典,并希望保持位置。

我想在字典中维护文本的出现 而对于价值,它将是列表的列表,它将首先包含 定位文本来自的列表,其余是索引 它在那个清单中。如果它出现在第二个列表然后第二个列表 和第二列表中的索引等等。

这是我的代码:

    def make_dict(lists):
        my_dict = defaultdict(lambda:None)    
        for sublist in lists: 
            for i in range(len(sublist)):        
                if sublist[i] in my_dict: 
                    my_dict[sublist[i]].append(i) 
                else:           
                my_dict[sublist[i]] = [i]
        return my_dict

示例输入:

    some_dict = make_dict([['d', 'e', 'f','d'], ['d', 'g','f']])

    print some_dict['d']

    print some_dict['e']

    print some_dict['g']

示例输出:

    [[0,0,3],[1,0]]

d出现在索引为0和3的第一个列表(0)中,然后出现在索引为0的第二个列表(1)中。

    [[0,1]]

e出现在索引为1的第一个列表(0)中

    [[1,1]]

g出现在索引为1的第二个列表(1)中

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以这样做:

def make_dict(seq):
    dic =  {}
    for i, lis in enumerate(seq):
        indices = {}
        for j, item in enumerate(lis):
            indices.setdefault(item, [i]).append(j)
        for k, v in indices.items():
            dic.setdefault(k, []).append(v)
    return dic

lis = [['d', 'e', 'f','d'], ['d', 'g','f']]

<强>输出:

>>> my_dict = make_dict([['d', 'e', 'f','d'], ['d', 'g','f']])
>>> my_dict['d']
[[0, 0, 3], [1, 0]]
>>> my_dict['e']
[[0, 1]]

答案 1 :(得分:0)

而不是此输出

some_dict['d']
[[0,0,3],[1,0]]

为什么不输出这个?

some_dict['d']
{0:[0,3],1:[0]}

这可以通过defaultdict来提供defaultdict(list)

def make_dict(nested_list):
    d = defaultdict(lambda: defaultdict(list))

    for i,li in enumerate(nested_list):
        for j,c in enumerate(li):
            d[c][i].append(j)
    return d

演示

some_dict['d']
Out[12]: defaultdict(<class 'list'>, {0: [0, 3], 1: [0]})

some_dict['e']
Out[13]: defaultdict(<class 'list'>, {0: [1]})