创建一个包含大量键值对的字典列表
Creating a list of dictionaries with numerous key value pairs
我有多个列表,我需要将它们组合成一个具有多个键值对的字典列表,其中值本身可以包含一个列表 - 例如:
namesIDs = [1, 2, 3, 4, 5]
namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
address = ['addr1', 'addr2', 'addr3', 'addr4', 'addr5']
parentsIDs = [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 55, 56]
parentsNames = ['Teague', 'MrsT', 'gPaT', 'gMaT', 'Arathorn', 'Gilraen', 'gPaAg', 'gMaAg', 'James', 'Lily', 'gPaHp', 'gMaHp', 'Bungo', 'Belladona', 'gPaB', 'gMaB', 'Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']
我期望的输出是:
[{'nameIDs': 1, 'namesList': 'jacksparrow', 'address': 'addr1', 'parentsIDs': [11,12,13,14], 'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2, 'namesList': 'aragorn', 'address': 'addr2', 'parentsIDs': [21,22,23,24], 'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3, 'namesList': 'harrypotter', 'address': 'addr3', 'parentsIDs': [31,32,33,34], 'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4, 'namesList': 'bilbo', 'address': 'addr4', 'parentsIDs': [41,42,43,44], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5, 'namesList': 'einstein', 'address': 'addr5', 'parentsIDs': [51,52,53,54,55,56], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB', 'babyA', 'babyB']}
]
注意最后一项 parentsIDs/parentsNames 比其余的要长。
我试过使用 zip 和 dict 理解,但它 work/make 对我来说没有意义。
>>> namesIDs = [1, 2, 3, 4, 5]
>>> namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
>>> [dict(zip(('NameID', 'Name'), item )) for item in namesList]
[{'NameID': 'j', 'Name': 'a'}, {'NameID': 'a', 'Name': 'r'}, {'NameID': 'h', 'Name': 'a'}, {'NameID': 'b', 'Name': 'i'}, {'NameID': 'e', 'Name': 'i'}]
编辑:
请注意,parentsIDs 和 parentsNames 可能任意长。 parentsID的第一位决定一个parentsID对应哪个nameID
您可以为最后 2 个列表创建列表列表,然后使用 zip
和 list_comprehension
。
from collections import defaultdict
namesIDs = [1, 2, 3, 4, 5]
namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
address = ['addr1', 'addr2', 'addr3', 'addr4', 'addr5']
parentsNames = ['Teague', 'MrsT', 'gPaT', 'gMaT', 'Arathorn', 'Gilraen', 'gPaAg', 'gMaAg', 'James', 'Lily', 'gPaHp', 'gMaHp', 'Bungo', 'Belladona', 'gPaB', 'gMaB', 'Herman', 'Pauline', 'Abraham', 'Helene']
parentsIDs = [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54]
kv = {k:list(range(k*10, (k*10+10))) for k in namesIDs}
nd = defaultdict(list)
npnts = defaultdict(list)
for ele,pn in zip(parentsIDs, parentsNames):
for k, v in kv.items():
if ele in v:
nd[k].append(ele)
npnts[k].append(pn)
nd = dict(nd)
npnts = dict(npnts)
parentsIDs = [v for k,v in nd.items()]
parentsNames = [v for k,v in npnts.items()]
final_dict = [{"nameIDs":n,"namesList":nl, "address":ad, 'parentsIDs':pid, 'parentsNames':pn} for n,nl,ad,pid,pn in zip(namesIDs,namesList,address,parentsIDs,parentsNames)]
print(final_dict)
您可以在以下列表理解中使用列表切片。
parentsIDsLists = [[]]
parentsNamesLists = [[]]
for i,j in zip(map(str, parentsIDs), parentsNames):
if parentsIDsLists[-1] != [] and i[0] != parentsIDsLists[-1][-1][0]:
parentsIDsLists.append([])
parentsNamesLists.append([])
parentsIDsLists[-1].append(i)
parentsNamesLists[-1].append(j)
out = [dict(zip(('nameIDs', 'namesList', 'address', 'parentsIDs', 'parentsNames'), tpl[:-2]+(list(map(int,tpl[-2])),)+(tpl[-1],)))
for tpl in zip(namesIDs, namesList, address, parentsIDsLists, parentsNamesLists)]
输出:
[{'nameIDs': 1,
'namesList': 'jacksparrow',
'address': 'addr1',
'parentsIDs': [11, 12, 13, 14],
'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2,
'namesList': 'aragron',
'address': 'addr2',
'parentsIDs': [21, 22, 23, 24],
'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3,
'namesList': 'harrypotter',
'address': 'addr3',
'parentsIDs': [31, 32, 33, 34],
'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4,
'namesList': 'bilbo',
'address': 'addr4',
'parentsIDs': [41, 42, 43, 44],
'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5,
'namesList': 'einstein',
'address': 'addr5',
'parentsIDs': [51, 52, 53, 54, 55, 56],
'parentsNames': ['Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']}]
您的具体示例展示了一种可以利用的 parentsID 模式。每个组都在十位范围内(11..14、21..24、...),因此我们可以使用 groupy 对 parentsIDs 列表进行分区,并在迭代器上使用 islice 对具有相同分布的 parentsNames 进行分组:
from itertools import groupby,islice
d = [ {'nameIDs':ni, 'namesList':nl, 'address':ad,
'parentIDs':pi, 'parentsNames':[*islice(pn,len(pi))] }
for pn in [iter(parentsNames)]
for ni,nl,ad,(pi,pi[:])
in zip(namesIDs, namesList, address,
groupby(parentsIDs,lambda i:[i//10]))]
输出:
[{'nameIDs': 1, 'namesList': 'jacksparrow', 'address': 'addr1', 'parentIDs': [11, 12, 13, 14], 'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2, 'namesList': 'aragron', 'address': 'addr2', 'parentIDs': [21, 22, 23, 24], 'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3, 'namesList': 'harrypotter', 'address': 'addr3', 'parentIDs': [31, 32, 33, 34], 'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4, 'namesList': 'bilbo', 'address': 'addr4', 'parentIDs': [41, 42, 43, 44], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5, 'namesList': 'einstein', 'address': 'addr5', 'parentIDs': [51, 52, 53, 54, 55, 56], 'parentsNames': ['Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']}]
显然这只是模拟数据,实际的 parentsIDs 可能无法根据 i//10
进行分组,但是,如果您有任何方法从 parentsIDs 值中获取不同的分组键,这将允许您形成与这些列表的所需分区相对应的任意大小的分组
我有多个列表,我需要将它们组合成一个具有多个键值对的字典列表,其中值本身可以包含一个列表 - 例如:
namesIDs = [1, 2, 3, 4, 5]
namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
address = ['addr1', 'addr2', 'addr3', 'addr4', 'addr5']
parentsIDs = [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54, 55, 56]
parentsNames = ['Teague', 'MrsT', 'gPaT', 'gMaT', 'Arathorn', 'Gilraen', 'gPaAg', 'gMaAg', 'James', 'Lily', 'gPaHp', 'gMaHp', 'Bungo', 'Belladona', 'gPaB', 'gMaB', 'Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']
我期望的输出是:
[{'nameIDs': 1, 'namesList': 'jacksparrow', 'address': 'addr1', 'parentsIDs': [11,12,13,14], 'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2, 'namesList': 'aragorn', 'address': 'addr2', 'parentsIDs': [21,22,23,24], 'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3, 'namesList': 'harrypotter', 'address': 'addr3', 'parentsIDs': [31,32,33,34], 'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4, 'namesList': 'bilbo', 'address': 'addr4', 'parentsIDs': [41,42,43,44], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5, 'namesList': 'einstein', 'address': 'addr5', 'parentsIDs': [51,52,53,54,55,56], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB', 'babyA', 'babyB']}
]
注意最后一项 parentsIDs/parentsNames 比其余的要长。 我试过使用 zip 和 dict 理解,但它 work/make 对我来说没有意义。
>>> namesIDs = [1, 2, 3, 4, 5]
>>> namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
>>> [dict(zip(('NameID', 'Name'), item )) for item in namesList]
[{'NameID': 'j', 'Name': 'a'}, {'NameID': 'a', 'Name': 'r'}, {'NameID': 'h', 'Name': 'a'}, {'NameID': 'b', 'Name': 'i'}, {'NameID': 'e', 'Name': 'i'}]
编辑: 请注意,parentsIDs 和 parentsNames 可能任意长。 parentsID的第一位决定一个parentsID对应哪个nameID
您可以为最后 2 个列表创建列表列表,然后使用 zip
和 list_comprehension
。
from collections import defaultdict
namesIDs = [1, 2, 3, 4, 5]
namesList = ['jacksparrow', 'aragron', 'harrypotter', 'bilbo', 'einstein']
address = ['addr1', 'addr2', 'addr3', 'addr4', 'addr5']
parentsNames = ['Teague', 'MrsT', 'gPaT', 'gMaT', 'Arathorn', 'Gilraen', 'gPaAg', 'gMaAg', 'James', 'Lily', 'gPaHp', 'gMaHp', 'Bungo', 'Belladona', 'gPaB', 'gMaB', 'Herman', 'Pauline', 'Abraham', 'Helene']
parentsIDs = [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44, 51, 52, 53, 54]
kv = {k:list(range(k*10, (k*10+10))) for k in namesIDs}
nd = defaultdict(list)
npnts = defaultdict(list)
for ele,pn in zip(parentsIDs, parentsNames):
for k, v in kv.items():
if ele in v:
nd[k].append(ele)
npnts[k].append(pn)
nd = dict(nd)
npnts = dict(npnts)
parentsIDs = [v for k,v in nd.items()]
parentsNames = [v for k,v in npnts.items()]
final_dict = [{"nameIDs":n,"namesList":nl, "address":ad, 'parentsIDs':pid, 'parentsNames':pn} for n,nl,ad,pid,pn in zip(namesIDs,namesList,address,parentsIDs,parentsNames)]
print(final_dict)
您可以在以下列表理解中使用列表切片。
parentsIDsLists = [[]]
parentsNamesLists = [[]]
for i,j in zip(map(str, parentsIDs), parentsNames):
if parentsIDsLists[-1] != [] and i[0] != parentsIDsLists[-1][-1][0]:
parentsIDsLists.append([])
parentsNamesLists.append([])
parentsIDsLists[-1].append(i)
parentsNamesLists[-1].append(j)
out = [dict(zip(('nameIDs', 'namesList', 'address', 'parentsIDs', 'parentsNames'), tpl[:-2]+(list(map(int,tpl[-2])),)+(tpl[-1],)))
for tpl in zip(namesIDs, namesList, address, parentsIDsLists, parentsNamesLists)]
输出:
[{'nameIDs': 1,
'namesList': 'jacksparrow',
'address': 'addr1',
'parentsIDs': [11, 12, 13, 14],
'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2,
'namesList': 'aragron',
'address': 'addr2',
'parentsIDs': [21, 22, 23, 24],
'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3,
'namesList': 'harrypotter',
'address': 'addr3',
'parentsIDs': [31, 32, 33, 34],
'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4,
'namesList': 'bilbo',
'address': 'addr4',
'parentsIDs': [41, 42, 43, 44],
'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5,
'namesList': 'einstein',
'address': 'addr5',
'parentsIDs': [51, 52, 53, 54, 55, 56],
'parentsNames': ['Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']}]
您的具体示例展示了一种可以利用的 parentsID 模式。每个组都在十位范围内(11..14、21..24、...),因此我们可以使用 groupy 对 parentsIDs 列表进行分区,并在迭代器上使用 islice 对具有相同分布的 parentsNames 进行分组:
from itertools import groupby,islice
d = [ {'nameIDs':ni, 'namesList':nl, 'address':ad,
'parentIDs':pi, 'parentsNames':[*islice(pn,len(pi))] }
for pn in [iter(parentsNames)]
for ni,nl,ad,(pi,pi[:])
in zip(namesIDs, namesList, address,
groupby(parentsIDs,lambda i:[i//10]))]
输出:
[{'nameIDs': 1, 'namesList': 'jacksparrow', 'address': 'addr1', 'parentIDs': [11, 12, 13, 14], 'parentsNames': ['Teague', 'MrsT', 'gPaT', 'gMaT']},
{'nameIDs': 2, 'namesList': 'aragron', 'address': 'addr2', 'parentIDs': [21, 22, 23, 24], 'parentsNames': ['Arathorn', 'Gilraen', 'gPaAg', 'gMaAg']},
{'nameIDs': 3, 'namesList': 'harrypotter', 'address': 'addr3', 'parentIDs': [31, 32, 33, 34], 'parentsNames': ['James', 'Lily', 'gPaHp', 'gMaHp']},
{'nameIDs': 4, 'namesList': 'bilbo', 'address': 'addr4', 'parentIDs': [41, 42, 43, 44], 'parentsNames': ['Bungo', 'Belladona', 'gPaB', 'gMaB']},
{'nameIDs': 5, 'namesList': 'einstein', 'address': 'addr5', 'parentIDs': [51, 52, 53, 54, 55, 56], 'parentsNames': ['Herman', 'Pauline', 'Abraham', 'Helene', 'babyA', 'babyB']}]
显然这只是模拟数据,实际的 parentsIDs 可能无法根据 i//10
进行分组,但是,如果您有任何方法从 parentsIDs 值中获取不同的分组键,这将允许您形成与这些列表的所需分区相对应的任意大小的分组