python 3 -根据键匹配和追加字典



给定一个非常大的列表,称为tsv_data,它类似于:

{'id':1,'name':'bob','size':2},
{'id':2,'name':'bob','size':3},
{'id':3,'name':'sarah','size':2},
{'id':4,'name':'sarah','size':2},
{'id':5,'name':'sarah','size':3},
{'id':6,'name':'sarah','size':3},
{'id':7,'name':'jack','size':5},

和其中所有唯一字符串的单独列表,称为names:

{'bob','sarah','jack'}
目的是生成以下数据结构:
[
{'name':'bob','children':
[
{'id':1,'size':2},
{'id':2,'size':3}
]
},
{'name':'sarah','children':
[
{'id':3,'size':2},
{'id':4,'size':2},
{'id':5,'size':3},
{'id':6,'size':3}
]
},
{'name':'jack','children':
[
{'id':7,'size':5}
]
}
]

这对我来说是一个挑战,因为每个长度是不同的,所以写一个for循环来重组。

是否存在对name的每个项目的长度具有鲁棒性的python解决方案?请示范一下,谢谢。

这是一个简单的解决方案。

tsv_data = [
{'id':1,'name':'bob','size':2},
{'id':2,'name':'bob','size':3},
{'id':3,'name':'sarah','size':2},
{'id':4,'name':'sarah','size':2},
{'id':5,'name':'sarah','size':3},
{'id':6,'name':'sarah','size':3},
{'id':7,'name':'jack','size':5}
]
names = {'bob','sarah','jack'}
expected_keys = ('id', 'size')
result = []
for name in names:
result.append({'name': name,
'children': [ {k: v for k, v in d.items() if k in expected_keys}
for d in tsv_data if d.get('name') == name ]})
# result:
# [{'name': 'sarah',
#  'children': [{'id': 3, 'size': 2},
#   {'id': 4, 'size': 2},
#   {'id': 5, 'size': 3},
#   {'id': 6, 'size': 3}]},
# {'name': 'bob', 'children': [{'id': 1, 'size': 2}, {'id': 2, 'size': 3}]},
# {'name': 'jack', 'children': [{'id': 7, 'size': 5}]}]

在这个解决方案中,它为每个name遍历整个tsv_data。如果tsv_datanames很大,并且您想要运行得更快,您可以创建另一个字典来通过name获得tsv_data的子集。

相关内容

  • 没有找到相关文章

最新更新