Abh*_*pal 5 python dictionary group-by python-itertools
我正在寻找一种Pythonic方式或更有效的方法来解决这个问题.我有一个字典,其中设置为值(跨键允许重复).给定一个列表,我必须创建一个字典,使用主字典中的键将每个类别映射到元素.我举一个例子来说明.
大师词典
{
"KeyA": ['Aron', 'Ranom Value', 'Abhishek'],
"KeyB": ['Ball', 'Foo', 'Bar', 'Badge', 'Dog'],
"KeyZ": ['Random Value', 'Foo', 'Bar']
}
Run Code Online (Sandbox Code Playgroud)
输入
['Foo', 'Bar', 'Dog', 'Aron']
Run Code Online (Sandbox Code Playgroud)
产量
{
"KeyA": ['Aron'],
"KeyB": ['Bar', 'Foo', 'Dog'],
"KeyZ": ['Foo', 'Bar']
}
Run Code Online (Sandbox Code Playgroud)
将集合中的单个项目反转为键,然后执行查找.
{
'Aron' : ['KeyA'],
'Foo' : ['KeyB', 'KeyZ'],
'Bar' : ['KeyB', 'KeyZ'],
'Random Value' : ['KeyA', 'KeyZ']
}
Run Code Online (Sandbox Code Playgroud)
我通过遍历每一组中的每一项来初始化倒置的字典.创建这样的字典的大约时间是O(n).在如此创建的反向字典中查找列表中的项目.说出价值Bar.使用该信息创建新词典'Bar': ['KeyB', 'KeyZ'].结果词典将是{'KeyB': ['Bar'], 'KeyZ': ['Bar']}.对于下一个项目,我必须在现有字典上进行一些簿记,如是否存在密钥,如果是,则附加到现有列表,依此类推.
使用映射的集合中的in运算符(检查成员资格)到每个键
主词典和输入列表在大多数时候都会非常小.(所有套装中的独特物品少于500件).所以我可以检查每个键返回的集合的成员资格并创建一个字典.这显然效率较低,但适用于大多数情况.
我还有一些类似于上面给出的例子的操作.我不想为所有这些操作进行手动记账,因为它们容易出错并且比内置功能慢.
我需要的?
在开始转换之前将列表转换为集合怎么样?集合查找比列表中的线性搜索更快.
input_set = set(input)
Run Code Online (Sandbox Code Playgroud)
一旦你拥有它,你可以使用常规字典理解,在我看来:
output = {key: [x for x in value if x in input_set] for key, value in master_dict.items()}
Run Code Online (Sandbox Code Playgroud)
结果:
output == {'KeyB': ['Foo', 'Bar', 'Dog'], 'KeyA': ['Aron'], 'KeyZ': ['Foo', 'Bar']}
Run Code Online (Sandbox Code Playgroud)