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

3

我有几个这样的列表:

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()等多种算法,但都没有成功...

你只是将 Pargs[0]indices[0]Pargs[1]indices[1] 等组合起来吗? - glibdud
据我所了解,是的。 - Albert
字典需要有序吗? - SirParselot
我已经将该要求编辑到问题中。 - timgeb
4个回答

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)]

哦,没关系。哇,太棒了!它很整洁简明。非常感谢! - Albert
@Albert 没问题 :) - timgeb

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}]
>>> 

你似乎在尝试中漏掉了一个关键点,那就是同时迭代索引和Pargs。

是的!这正是我需要的。我感到既伤心又开心。开心是因为我终于得到了我需要的东西,但伤心的是我自己无法解决这个问题。非常感谢你! - Albert
非常欢迎。请用美味的“业力”表达感谢,并接受我的答案 :) - greg_data
我投了你的回复一票。但是,在我的判断中,上面那个人提出了一个更漂亮的解决方案。尽管它与你的解决方案并没有太大的区别。在这里选择最佳答案真的很难! - Albert
我其实同意你的观点,并且也点赞了timgeb的回答:D - greg_data

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

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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接