确保县界字典中的共同性/互惠性

时间:2017-05-21 16:55:39

标签: python dictionary recursion

背景:我从美国人口普查的县邻接档案开始。不幸的是,该文件格式不一致,因此我的初始脚本将此tab分隔文件提取到具有县i的键(由其Fips代码表示)的字典中,以及所有相邻列表的值到县i(再次使用Fips代码)会产生错误。

问题:我当前的字典违反了"互惠"。如果一个县与另一个县接壤,第二个县也必须与第一个县接壤。在我的字典中,对于县i,通常有一个县j位于县i的相邻县的值中,但县i不是包含在关键县j的值中。

渴望解决方案:包含每个县(密钥或0条目)及其所有相邻县的条目的字典或列表列表。

任务:遍历字典中的每个项目,使用每个项目的值列表中的键访问所有项目,并检查互惠关系是否成立(如果没有,则添加该键)

最低工作范例(无意义值):

Adj_counties_pre  = { 12000 : [12001, 12003], 
                      12001 : [12004], 
                      12003 : [12004, 12001], 
                      12004 : [12003, 12000]}
...
Adj_counties_post = { 12000 : [12001, 12003, 12004], 
                      12001 : [12004, 12003, 12000], 
                      12003 : [12004, 12001, 12000], 
                      12004 : [12003, 12000, 12001]}

我无法弄清楚如何遍历字典来解决这个问题  谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用以下解决方案:

from collections import defaultdict

result = defaultdict(set)

for k,vs in adj_counties_pre.items():
    for v in vs:
        result[k].add(v)
        result[v].add(k)

adj_counties_post = {k:list(v) for k,v in result.items()}

代码的工作原理如下,首先我们构造一个临时的defaultdict(set)defaultdict是一个字典,如果找不到某个键,则通过调用 factory (此处为set)来构造值。

接下来,我们遍历所有键值对(k,vs)。对于元素vs的每个值v。对于每个键元素对,我们将元素v添加到与键k关联的集合中,将键k添加到与元素v关联的集合中。

接下来我们要么完成了(一个defaultdict是一个字典,这个是在一组县代码上映射县代码),或者我们可以决定把它变成一个字典理解的香草词典。然后生成:

>>> adj_counties_post
{12000: [12001, 12003, 12004], 12001: [12000, 12003, 12004], 12003: [12000, 12001, 12004], 12004: [12000, 12001, 12003]}

还要注意,变量通常以小写字母开头。