识别具有多重持有的重复项

2024-07-08 17:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表List1,格式为{Account Name:{Stock Name:Stock Allocations}},如下所示:

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中作为值出现三次。你知道吗

我使用以下代码来获取值:

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 

Tags: nameinforstock帐户accountabclist1
3条回答

您可以尝试以下代码段:

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)) 

列表中的元素是一个条目字典,因此处理起来比必要的要麻烦得多。如果列表中每个元素只有一个account,那么应该改为使用tuple(account,allocations)。你知道吗

将List1转换为该格式(allocs变量)会使代码模式变得更直接:

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

您可以做的是创建另一个字典,其中key作为其他字典的值,并且该字典的值是该字典的一组键。基本上,您可以还原字典,其中键是值,值是一组键。因此,如果您有相同的值,那么这些值的键将是该键的一部分。你知道吗

下面是一个dict在转换后的样子:

{(('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'}")

输出:

Account Name   Duplicates
A001           A003, A004
A003           A001, A004
A004           A001, A003
A002           No duplicate

相关问题 更多 >

    热门问题