在dict中查找给定键的公共值,其中每个值都是一个集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在dict中查找给定键的公共值,其中每个值都是一个集合相关的知识,希望对你有一定的参考价值。

我有两个从csv文件创建的dicts(参见下面的文件):

a_data = {
    '78567908': {'26.01.21', '02.03.24', '26.01.12', '02.03.01', '04.03.03', '01.01.13', '01.01.10', '26.01.17'},
    '85789070': {'02.03.17', '02.05.01', '02.05.04', '26.01.02', '09.01.04'},
    '87140110': {'03.15.19', '03.15.25', '03.15.24'},
    '87142218': {'26.17.13', '02.03.22', '02.11.01'},
    '87006826': {'28.01.03'}
}

p_data = {
    '78567908': {'24.11.01', '26.01.21', '24.11.02', '02.03.24', '02.03.01', '04.03.03', '01.01.13', '26.01.18', '01.01.10'},
    '85789070': {'02.05.05', '02.03.17', '02.05.24', '02.05.01', '02.05.04', '26.01.02', '09.01.04'},
    '87140110': {'03.15.19', '03.15.25', '03.15.10', '03.15.24'},
    '87142218': {'26.17.13', '02.03.22', '02.11.01', '02.03.02', '02.03.24', '02.11.13'},
    '87006826': {'28.01.03'}
}

我想把p_dataa_data进行比较。我想知道a_datap_data中的每个键,a_data中的交叉点和值是什么,而p_data中没有。

对于关键78567908p_data有8个值中的6个。共同的价值观是

01.01.10
01.01.13
02.03.01
02.03.24
04.03.03
26.01.21

而缺失的值是

26.01.12
26.01.17

csv文件如下所示:

78567908,01.01.10,01.01.13,02.03.01,02.03.24,04.03.03,26.01.12,26.01.17,26.01.21
85789070,02.03.17,02.05.01,02.05.04,09.01.04,26.01.02
87140110,03.15.19,03.15.24,03.15.25
87142218,02.03.22,02.11.01,26.17.13
87006826,28.01.03

我使用以下代码创建了dicts:

a_data = {}
with open(cvsfile) as fin:
    reader = csv.reader(fin, skipinitialspace=True)
    for row in reader:
        a_data[row[0]]=set(row[1:])

如果有一种比dicts(如数据框架)更好的方式作为同一产品到货,我会接受这个作为答案。到目前为止,我只设法创建了两个字典或数据框,但在比较两个字典/数据框时没有任何进展。

答案

你可以用熊猫试试这个:

import pandas as pd
a_data = {'78567908': {'26.01.21', '02.03.24', '26.01.12', '02.03.01', '04.03.03', '01.01.13', '01.01.10', '26.01.17'}, '85789070': {'02.03.17', '02.05.01', '02.05.04', '26.01.02', '09.01.04'}, '87140110': {'03.15.19', '03.15.25', '03.15.24'}, '87142218': {'26.17.13', '02.03.22', '02.11.01'}, '87006826': {'28.01.03'}}

p_data = {'78567908': {'24.11.01', '26.01.21', '24.11.02', '02.03.24', '02.03.01', '04.03.03', '01.01.13', '26.01.18', '01.01.10'}, '85789070': {'02.05.05', '02.03.17', '02.05.24', '02.05.01', '02.05.04', '26.01.02', '09.01.04'}, '87140110': {'03.15.19', '03.15.25', '03.15.10', '03.15.24'}, '87142218': {'26.17.13', '02.03.22', '02.11.01', '02.03.02', '02.03.24', '02.11.13'}, '87006826': {'28.01.03'}}

a = pd.DataFrame.from_dict(a_data, orient='index')
p = pd.DataFrame.from_dict(p_data, orient='index')

a.apply(lambda x: sum(i in p.loc[x.name,:].tolist() for i in x.dropna()), axis=1)

输出:

78567908    6
85789070    5
87140110    3
87142218    3
87006826    1
dtype: int64

以上是关于在dict中查找给定键的公共值,其中每个值都是一个集合的主要内容,如果未能解决你的问题,请参考以下文章

创建和查找每个值具有多个键的 2D 字典

2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。

从向量数组中查找给定向量中公共元素的数量

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?

如何将带有索引列表的dict映射到新变量

如何将逗号分隔的字符串转换为字符串,其中键是一个项目,值是键的长度