从Python中的几个列表构建字典列表

时间:2016-02-05 13:46:27

标签: python dictionary

我有几个这样的列表:

Pargs = [args.Pee, args.Pem,...,args.Pet] # 9 elements of boolean type
indices = [(0,0),(0,1),...,(2,2)] # 9 possible combinations (i,j), i = 0,1,2; j = 0,1,2
D = [{},{},...,{}] # 9 dictionaries, desired result

我想看到的结果应如下所示:

D = [{event:args.Pee,i:0,j:0},{event:args.Pem,i:0,j:1},...{event: args.Pet,i:2,j:2}]

字典必须如上所示进行排序。

我试过

for d in D:
    for i in range(3):
        for j in range(3):
            d['i'],d['j'] = i,j

但它不能解决问题。我用zip(),product(),dict()尝试了很多算法,但无济于事......

4 个答案:

答案 0 :(得分:4)

理解并OrderedDict,演示:

from collections import OrderedDict
pargs = ['arg1', 'arg2', 'arg3', 'arg4', 'arg5', 'arg6', 'arg7', 'arg8', 'arg9']
indices = ((x,y) for x in range(3) for y in range(3))
result = [OrderedDict([('event',p), ('i',i), ('j',j)]) for p,(i,j) in zip(pargs, indices)]
print(result) # [OrderedDict([('event', 'arg1'), ('i', 0), ('j', 0)]), OrderedDict([('event', 'arg2'), ('i', 0), ('j', 1)]), OrderedDict([('event', 'arg3'), ('i', 0), ('j', 2)]), OrderedDict([('event', 'arg4'), ('i', 1), ('j', 0)]), OrderedDict([('event', 'arg5'), ('i', 1), ('j', 1)]), OrderedDict([('event', 'arg6'), ('i', 1), ('j', 2)]), OrderedDict([('event', 'arg7'), ('i', 2), ('j', 0)]), OrderedDict([('event', 'arg8'), ('i', 2), ('j', 1)]), OrderedDict([('event', 'arg9'), ('i', 2), ('j', 2)])]

修改

如果我误解了您的要求以及 中的这些词典并不重要,您可以在没有OrderedDict这样的情况下执行此操作:

result = [{'event':p, 'i':i, 'j':j} for p,(i,j) in zip(pargs, indices)]

答案 1 :(得分:1)

从问题的外观来看,您需要执行以下操作:

>>> Pargs = [str(i) for i in range(9)]
>>> Pargs
9: ['0', '1', '2', '3', '4', '5', '6', '7', '8']
>>> indeces = [(i, j) for i in range(3) for j in range(3)]
10: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
>>> D = [{'event':Pargs[ind], 'i':i[0], 'j':i[1]} for ind, i in enumerate(indeces)]
>>> D
11: [{'event': '0', 'i': 0, 'j': 0},
 {'event': '1', 'i': 0, 'j': 1},
 {'event': '2', 'i': 0, 'j': 2},
 {'event': '3', 'i': 1, 'j': 0},
 {'event': '4', 'i': 1, 'j': 1},
 {'event': '5', 'i': 1, 'j': 2},
 {'event': '6', 'i': 2, 'j': 0},
 {'event': '7', 'i': 2, 'j': 1},
 {'event': '8', 'i': 2, 'j': 2}]
>>> 

你在尝试中似乎缺少的关键是同时迭代indeces和Pargs。

答案 2 :(得分:0)

您只需要一个循环来跟踪多个索引。也许这不是你想要的,但是从这里开始

i = 0
j = 0
for d in range(9):
    D[d] = {'event':Pargs[d], 'i':i, 'j':j}
    if j == 2:
        j = 0
        i += 1
    else:
        j += 1

答案 3 :(得分:0)

如果Pargsindices具有相同数量的元素,您可以使用以下两种方式之一来执行此操作,具体取决于您所说的“必须订购的字母”。

这将按照您的问题中显示的顺序生成字典列表:

D = [{'event': parg, 'i':pair[0], 'j':pair[1]}
        for parg, pair in zip(Pargs, indices)]

如果您的意思是希望每个字典的内容按照显示的顺序(以及它们在列表中的顺序),您需要使用collections.OrderedDict来保存数据,因为常规字典不保留其内容的顺序(键,值对)。

from collections import OrderedDict

D = [OrderedDict([('event', parg), ('i', pair[0]), ('j', pair[1])])
        for parg, pair in zip(Pargs, indices)]