【问题标题】:Optimize loop in python with two array of dictionaries [duplicate]使用两个字典数组优化python中的循环[重复]
【发布时间】:2020-08-06 06:57:51
【问题描述】:

我在 Python 3.7 中有两个字典数组,我需要使用一个公共键加入它们。

array_1 = [
    {'address1': 'KR 10 B # 14 - 03', 'id': 6605, 'commune1': 'COMUNA 2'}, 
    {'address1': 'KR 90 # 2 OESTE - 17', 'id': 9565, 'commune1': 'COMUNA 18'}, 
    {'address1': 'CL 72 J # 5 NORTE - 70', 'id': 8493, 'commune1': 'COMUNA 6'}, 
    {'address1': 'PAISAJES DEL CASTILLO CS 29', 'id': 10330, 'commune1': ''}
]

array_2 = [
    {'coddirplaca': 'A', 'id': 9565}, 
    {'coddirplaca': 'B','id': 6605}, 
    {'coddirplaca': 'C','id': 10330}, 
    {'coddirplaca': 'D','id': 8493}
]

所以,我需要一个这样的数组:

array_3 = [
        {'address1': 'KR 10 B # 14 - 03', 'id': 6605, 'commune1': 'COMUNA 2', 'coddirplaca': 'B'}, 
        {'address1': 'KR 90 # 2 OESTE - 17', 'id': 9565, 'commune1': 'COMUNA 18', 'coddirplaca': 'A'}, 
        {'address1': 'CL 72 J # 5 NORTE - 70', 'id': 8493, 'commune1': 'COMUNA 6', 'coddirplaca': 'D'}, 
        {'address1': 'PAISAJES DEL CASTILLO CS 29', 'id': 10330, 'commune1': '', 'coddirplaca': 'C'}
    ]

我有这段代码,它将来自array_1 的一个字典与来自array_2 的所有列表进行比较并且工作良好,但是这修改了我原来的array_1:

for dict_1 in array_1:
    for index in range(len(array_2)):
        dict_2 = array_2[index]
        if dict_1['id'] == dict_2['id']:
            dict_1['coddirplaca'] = dict_2['coddirplaca'] # I create a new key/value in each dict_2
print(array_1)

如何优化这个循环?

注意:array_1array_2 始终具有相同的长度。

【问题讨论】:

  • 您是否考虑过将它们转换为 pandas 数据帧并使用其连接功能?
  • @Barmar 是的,事实上,array_3 将被传递给 pandas.Dataframe() 以获取 Dataframe。那么您认为将array_1array_2 转换为pandas 数据框更好吗?
  • 这可能会更容易。
  • array_3 = [{**x, **y} for x in array_1 for y in array_2 if y["id"] == x["id"]]
  • 由于这个问题已关闭,我已将我的 pandas 答案添加到链接的问题中。简而言之,您可以在将 pandas 导入为pd 后使用pd.DataFrame(array_1).merge(pd.DataFrame(array_2), on=['id']).to_dict('records')。如果您想保留数据框,只需删除 .to_dict('records')

标签: python python-3.x optimization


【解决方案1】:
array_1 = [
    {'address1': 'KR 10 B # 14 - 03', 'id': 6605, 'commune1': 'COMUNA 2'},
    {'address1': 'KR 90 # 2 OESTE - 17', 'id': 9565, 'commune1': 'COMUNA 18'},
    {'address1': 'CL 72 J # 5 NORTE - 70', 'id': 8493, 'commune1': 'COMUNA 6'},
    {'address1': 'PAISAJES DEL CASTILLO CS 29', 'id': 10330, 'commune1': ''}
]

array_2 = [
    {'coddirplaca': 'A', 'id': 9565},
    {'coddirplaca': 'B','id': 6605},
    {'coddirplaca': 'C','id': 10330},
    {'coddirplaca': 'D','id': 8493}
]

array_3 = {d['id']: d for d in array_1}
for d in array_2:
    array_3[d['id']].update(d)

from pprint import pprint
pprint(list(array_3.values()))

打印:

[{'address1': 'KR 10 B # 14 - 03',
  'coddirplaca': 'B',
  'commune1': 'COMUNA 2',
  'id': 6605},
 {'address1': 'KR 90 # 2 OESTE - 17',
  'coddirplaca': 'A',
  'commune1': 'COMUNA 18',
  'id': 9565},
 {'address1': 'CL 72 J # 5 NORTE - 70',
  'coddirplaca': 'D',
  'commune1': 'COMUNA 6',
  'id': 8493},
 {'address1': 'PAISAJES DEL CASTILLO CS 29',
  'coddirplaca': 'C',
  'commune1': '',
  'id': 10330}]

【讨论】:

  • 嗨@Andrej,我终于实现了你的答案!,谢谢你..
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多