我想对数据集的类似条目进行分组。你知道吗
ds = {1: 'foo',
2: 'bar',
3: 'foo',
4: 'bar',
5: 'foo'}
>>>tupelize_dict(ds)
{
(1,3,5): 'foo',
(2,4): 'bar'
}
我写了这个函数,但我肯定有更简单的方法,不是吗?你知道吗
def tupelize_dict(data):
from itertools import chain, combinations
while True:
rounds = []
for x in combinations(data.keys(), 2):
rounds.append((x, data[x[0]], data[x[1]]))
end = True
for k, a, b in rounds:
if a == b:
k_chain = [x if isinstance(x, (tuple, list)) else [x] for x in k]
data[tuple(sorted(chain.from_iterable(k_chain)))] = a
[data.pop(r) for r in k]
end = False
break
if end:
break
return data
编辑
我对数据集的内容可以是允许ds[i] == ds[j]
的任何类型的对象的一般情况感兴趣:
ds = {1: {'a': {'b':'c'}},
2: 'bar',
3: {'a': {'b':'c'}},
4: 'bar',
5: {'a': {'b':'c'}}}
就像你可以这样做一样。你知道吗
像这样的事情应该可以做到:
按照acushner的答案,如果我能计算数据集元素内容的哈希值,就有可能使它工作。你知道吗
这个解决方案比我原来的提议快得多。你知道吗
为了测试它,我制作了一组大的随机嵌套字典,并在两个实现上运行
cProfile
:编辑:
我意识到
dumps
不适用于某些字典,因为键的顺序可能会因模糊的原因而在内部发生变化(参见question)一个解决方法是订购所有的dict:
相关问题 更多 >
编程相关推荐