我试图通过“分组”(可能不是正确的表达式,但是将其用作基于SQL的代理)来重构基于(非唯一)值的Python字典列表。我已经接近了,但是我遇到了最后的障碍,因为我无法弄清楚如何将每个值重新分配给一个名称(即,我最终看起来像元组而不是字典)。
此外,我还有一个多余的列表(即,我的输出最终以[[{...}]]而不是[{...}]来显示。
我在这里使用了示例:
How do I group this list of dicts by the same month?
这让我非常接近我想要的东西,但是我陷于最后阶段!
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
SecurityTokenValidated = async (x) =>
{
var identity = x.AuthenticationTicket.Identity;
identity.AddClaim(new Claim("test", "test"));
await Task.FromResult(0);
}
}
输出为:
market = [
{'selection_id': 1099, 'value': '11', 'value_name': 'a'},
{'selection_id': 1099, 'value': '78', 'value_name': 'p'},
{'selection_id': 1097, 'value': '39', 'value_name': 'b'},
{'selection_id': 1097, 'value': '52', 'value_name': 'f'},
{'selection_id': 1098, 'value': '98', 'value_name': 'd'},
{'selection_id': 1099, 'value': '13', 'value_name': 'y'},
{'selection_id': 1098, 'value': '4', 'value_name': 'r'},
]
new_structure = {}
new_structure2 = []
for z in market:
new_structure.setdefault(z['selection_id'], []).append((z['value'], z['value_name']))
t = [{'selection_id': m, 'value_dict': n} for m, n in new_structure.items()]
new_structure2.append(t)
print(new_structure2)
哪一个非常接近,但是我的目标是:
[[{'selection_id': 1099, 'value_dict': [('11', 'a'), ('78', 'p'), ('13',
'y')]}, {'selection_id': 1097, 'value_dict': [('39', 'b'), ('52', 'f')]},
{'selection_id': 1098, 'value_dict': [('98', 'd'), ('4', 'r')]}]]
我很欣赏它可能是一个非常简单的修复程序,但此刻它在逃避我,因此任何指导将不胜感激!
答案 0 :(得分:3)
以下是一些提示:
第一件事是按 selection_id 进行排序:
for selection_id, group in itertools.groupby(market, key=by_selection_id):
print(selection_id, list(group))
然后您可以按 selection_id 分组:
(1097, [{'value_name': 'b', 'value': '39', 'selection_id': 1097},
{'value_name': 'f', 'value': '52', 'selection_id': 1097}])
(1098, [{'value_name': 'd', 'value': '98', 'selection_id': 1098},
{'value_name': 'r', 'value': '4', 'selection_id': 1098}])
(1099, [{'value_name': 'a', 'value': '11', 'selection_id': 1099},
{'value_name': 'p', 'value': '78', 'selection_id': 1099},
{'value_name': 'y', 'value': '13', 'selection_id': 1099}])
您得到:
new_structure = [{'selection_id': selection_id,
'value_dict': [{'value': item['value'],
'value_name': item['value_name']} for item in group]}
for selection_id, group in itertools.groupby(market, key=by_selection_id)]
然后很容易建立最终列表。
这是使用理解列表/字典的解决方案:
append
或在new_structure = []
for selection_id, group in itertools.groupby(market, key=by_selection_id):
value_dict = [{'value': item['value'], 'value_name': item['value_name']} for item in group]
new_structure.append({'selection_id': selection_id,
'value_dict': value_dict})
中使用经典列表:
Path
答案 1 :(得分:1)
我最终看起来像元组而不是字典)
这是因为您要附加一个元组,而不是一个字典:
.append((z['value'], z['value_name']))
答案 2 :(得分:0)
因此,为了更新,我根据@ Code-Apprentice的回答进行了重新编写,如下所示:
market = [
{'selection_id': 1099, 'value': '11', 'value_name': 'a'},
{'selection_id': 1099, 'value': '78', 'value_name': 'p'},
{'selection_id': 1097, 'value': '39', 'value_name': 'b'},
{'selection_id': 1097, 'value': '52', 'value_name': 'f'},
{'selection_id': 1098, 'value': '98', 'value_name': 'd'},
{'selection_id': 1099, 'value': '13', 'value_name': 'y'},
{'selection_id': 1098, 'value': '4', 'value_name': 'r'},
]
new_structure = {}
new_structure2 = []
for z in market:
new_structure.setdefault(z['selection_id'], []).append({'value': z['value'],
'value_name': z['value_name']})
t = [{'selection_id': m, 'value_dict': n} for m, n in new_structure.items()]
new_structure2.append(t)
print(new_structure2)
这将使我非常接近所需的输出。我唯一剩下的问题是一个多余的列表(即[[[{....}]]而不是[{...}]),我相信这可能是因为我写了t = ....
这是我的输出,一旦我删除了多余的列表,以防其他人使用该答案(如果在我之前发现它,请随时大喊大叫),我将发布更新: / p>
[[{'selection_id': 1099,
'value_dict': [{'value': '11', 'value_name': 'a'},
{'value': '78', 'value_name': 'p'},
{'value': '13', 'value_name': 'y'}]},
{'selection_id': 1097,
'value_dict': [{'value': '39', 'value_name': 'b'},
{'value': '52', 'value_name': 'f'}]},
{'selection_id': 1098,
'value_dict': [{'value': '98', 'value_name': 'd'},
{'value': '4', 'value_name': 'r'}]}]]
太荒谬了!我太复杂了,只是简单地删除了额外的列表引用:
market = [
{'selection_id': 1099, 'value': '11', 'value_name': 'a'},
{'selection_id': 1099, 'value': '78', 'value_name': 'p'},
{'selection_id': 1097, 'value': '39', 'value_name': 'b'},
{'selection_id': 1097, 'value': '52', 'value_name': 'f'},
{'selection_id': 1098, 'value': '98', 'value_name': 'd'},
{'selection_id': 1099, 'value': '13', 'value_name': 'y'},
{'selection_id': 1098, 'value': '4', 'value_name': 'r'},
]
new_structure = {}
for z in market:
new_structure.setdefault(z['selection_id'], []).append({'value': z['value'],
'value_name': z['value_name']})
new_structure2 = [{'selection_id': m, 'value_dict': n} for m, n in new_structure.items()]