背景:我从美国人口普查的县邻接档案开始。不幸的是,该文件格式不一致,因此我的初始脚本将此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]}
我无法弄清楚如何遍历字典来解决这个问题 谢谢!
答案 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]}
还要注意,变量通常以小写字母开头。