识别具有多个馆藏的重复项

时间:2019-03-03 13:49:49

标签: python pandas

我有一个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 

3 个答案:

答案 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