字典所有键的共同项
我有一个字典,里面有“259136个键”,每个键都有一个或多个值。
我的目标是“找出那些至少有一个值和其他键相同的键”。
我尝试了不同的方法来解决这个问题,但我想要一个更快的解决方案。我试过:
- 对每个键,和其他259135个键进行比较,以检查上述条件。
- 把字典反转,把键和值对调,这样值就变成了键。这样我就有了两个字典,我可以根据第一个字典中的值,从第二个字典中提取出所有相关的值。
1 个回答
2
使用一个包含集合的字典:
d={ 'k1': [1,2,3],
'k2': [2],
'k3': [10],
'k4': [3,2]
}
com_keys={}
for k, v in d.items():
for e in v:
com_keys.setdefault(e, set()).add(k)
print com_keys
# {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k4'])}
如果你只想要那些有多个共同键的项,可以用字典推导式来过滤一下(如果你用的是老版本的Python,可以用类似的方法):
>>> {k:v for k,v in com_keys.items() if len(v)>1 }
{2: set(['k2', 'k1', 'k4']), 3: set(['k1', 'k4'])}
如果你的字典里有不同类型的容器,比如列表、元组等,同时还有一些不支持迭代的“单个项目”(比如整数、浮点数),或者你不想用for
循环去迭代的东西(比如字符串、Unicode、其他字典等),那就会稍微复杂一点。
举个例子,假设你有一个包含列表和“单个项目”的组合,这些单个项目是整数和字符串:
import collections
d={ 'k1': [1,2,3],
'k2': 2,
'k3': [10],
'k4': [3,2],
'k5': 'string',
'k6': ['string',2]
}
com_keys={}
for k, v in d.items():
if not isinstance(v, basestring) and isinstance(v, collections.Iterable):
for e in v:
com_keys.setdefault(e, set()).add(k)
else:
com_keys.setdefault(v, set()).add(k)
print com_keys
# {1: set(['k1']), 10: set(['k3']), 3: set(['k1', 'k4']), 2: set(['k2', 'k1', 'k6', 'k4']), 'string': set(['k6', 'k5'])}
print {k:v for k,v in com_keys.items() if len(v)>1 }
# {2: set(['k2', 'k1', 'k6', 'k4']), 3: set(['k1', 'k4']), 'string': set(['k6', 'k5'])}