我想對數據集的類似條目進行分組。將類似詞典的詞條組作爲鍵的組合鍵
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'}}}
那麼,在一般情況下,字典的值可能是一個複雜的對象而不是一個字符串,字典是不可干擾的......這表示通過獲取每個字典的散列來使用您的想法可能會很有趣。 – nowox