繁体   English   中英

如何将带有元组的元组列表转换为字典?

[英]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}

必须为密钥使用冻结集。 无法保证具有相同元素的集合将始终转换为与集合无序相同的reprtuple 除非你首先对设定元素进行排序,否则这看起来很浪费

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM