我有一个List1
字典列表,其格式为{帐户名称:{股票名称:库存分配}},例如:
List1 =[{'A001':{'ABC':0.4, 'ABD':0.6}}, {'A002':{'ABC':0.5, 'ABD':0.4, 'EFG':0.1}}, {'A003':{'ABC':0.4, 'ABD':0.6}}, {'A004':{'ABC':0.4, 'ABD':0.6}}]
{'ABC':0.4, 'ABD':0.6}
在三个帐户A001,A003和A004中作为值出现3次。
我使用以下代码获取值:
AccountName = []
for account in List1:
for key, value in account.items():
AccountName.append(value)
如何显示每个帐户的重复项,如下所示?例如
Account Name Duplicate(s)
A001 A003, A004
A002 No duplicate
A003 A001, A004
A004 A001, A003
答案 0 :(得分:1)
您可以尝试以下代码段:
res = []
for idx, item in enumerate(list1):
account_name = list(item.keys())[0]
value = list1[idx][account_name]
duplicates = ", ".join([list(i.keys())[0] for i in list1 if i[list(i.keys())[0]] == value and list(i.keys())[0] != account_name])
if not duplicates:
duplicates = "No duplicates"
res.append((account_name, duplicates))
答案 1 :(得分:1)
您可以做的是创建另一个词典,并用键作为其他词典的值,并且该词典的值是该词典的一组键。基本上,您还原字典,其中键是值,而值是键集。因此,如果您具有相同的值,则这些值的键将成为该键的一部分。
转换后的one_dict外观如下:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<input type="text" name="Name" style="text-transform:capitalize" />
</body>
</html>
然后就可以进行打码和打印了。
{(('ABC', 0.4), ('ABD', 0.6)): {'A003', 'A001', 'A004'},
(('ABC', 0.5), ('ABD', 0.4), ('EFG', 0.1)): {'A002'}})
输出:
from collections import defaultdict
list1 = [
{"A001": {"ABC": 0.4, "ABD": 0.6}},
{"A002": {"ABC": 0.5, "ABD": 0.4, "EFG": 0.1}},
{"A003": {"ABC": 0.4, "ABD": 0.6}},
{"A004": {"ABC": 0.4, "ABD": 0.6}},
]
one_dict = defaultdict(set)
for r in list1:
one_dict[tuple([*r.values()][0].items())].add([*r.keys()][0])
print(f"{'Account Name':<15}{'Duplicates'}")
for k, v in one_dict.items():
for i in v:
print(f"{i:<15}{', '.join(v - {i}) if 1 < len(v) else 'No duplicate'}")
答案 2 :(得分:1)
列表的元素是一本字典,使处理变得不必要。如果列表中每个元素只有一个帐户,则应改用元组(帐户,分配)。
将List1转换为该格式(分配变量)可使代码模式变得直截了当:
List1 = [{'A001':{'ABC':0.4, 'ABD':0.6}}, {'A002':{'ABC':0.5, 'ABD':0.4, 'EFG':0.1}}, {'A003':{'ABC':0.4, 'ABD':0.6}}, {'A004':{'ABC':0.4, 'ABD':0.6}}]
allocs = [ list(account.items())[0] for account in List1]
for account,alloc in allocs:
dups = [ac for ac,al in allocs if al == alloc and ac != account]
print( account, ", ".join(dups or ["no duplicates"]))
A001 A003, A004
A002 no duplicates
A003 A001, A004
A004 A001, A003