[英]How do I convert a list of tuples with sets to a dictionary?
我有這個數據集。 我想更新MySQL表。 我可以在當前表單中執行此操作,但我認為轉換為字典會縮小列表以進行更新。
我的數據集:
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
期望的輸出:
一本字典 :
output = {'set(['NY'])':121,198,676, 'set(['CA', 'NY'])':132,89}
您必須為密鑰使用凍結集。 無法保證具有相同元素的集合將始終轉換為與集合無序相同的repr
或tuple
。 除非你首先對設定元素進行排序,否則這看起來很浪費
from collections import defaultdict
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
output[frozenset(key)].append(value)
或使用排序的元組
from collections import defaultdict
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
output[tuple(sorted(key))].append(value)
隨機舉例來說明這一點
>>> s,t = set([736, 9753, 7126, 7907, 3350]), set([3350, 7907, 7126, 9753, 736])
>>> s == t
True
>>> tuple(s) == tuple(t)
False
>>> frozenset(s) == frozenset(t)
True
>>> hash(tuple(s)) == hash(tuple(t))
False
>>> hash(frozenset(s)) == hash(frozenset(t))
True
我不認為你可以有一set
作為字典鍵,所以也許一個元組?
from collections import defaultdict
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = defaultdict(list)
for value, key in dataset:
output[tuple(key)].append(value)
# or output[str(key)].append(value) if you want a string as the key
嘗試這個:
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
from collections import defaultdict
d = defaultdict(list)
for val, key in dataset:
d[repr(key)].append(int(val))
d
> {"set(['NY', 'CA'])": [132, 89], "set(['NY'])": [121, 198, 676]}
這是defaultdict
的替代方法:
dataset = [('121', set(['NY'])), ('132', set(['CA', 'NY'])), ('198', set(['NY'])), ('676', set(['NY'])), ('89', set(['NY', 'CA']))]
output = {}
for value, key in dataset:
output.setdefault(frozenset(key), []).append(value)
結果:
>>> output
{frozenset(['NY', 'CA']): ['132', '89'], frozenset(['NY']): ['121', '198', '676']}
由於以下行為,我更喜歡在defaultdict
使用setdefault()
:
>>> output = defaultdict(list, {frozenset(['NY', 'CA']): ['132', '89'], frozenset(['NY']): ['121', '198', '676']})
>>> output[frozenset(['FL'])] # instead of a key error, this modifies output
[]
>>> output
defaultdict(<type 'list'>, {frozenset(['NY', 'CA']): ['132', '89'], frozenset(['FL']): [], frozenset(['NY']): ['121', '198', '676']})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.