【问题标题】:How do I convert a list of tuples with sets to a dictionary?如何将带有集合的元组列表转换为字典?
【发布时间】:2012-06-05 22:16:35
【问题描述】:

我有这个数据集。我想更新 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}

【问题讨论】:

  • 您希望集合成为键还是希望集合的字符串表示成为键?

标签: list tuples python set


【解决方案1】:

必须使用 freezeset 作为密钥。不能保证具有相同元素的集合总是会变成相同的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

【讨论】:

    【解决方案2】:

    我认为您不能将 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
    

    【讨论】:

    • 如果你使用frozenset就可以
    • @jamylak,因为sets 是无序的,所以肯定会被冻结
    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

      这是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']}
      

      由于以下行为,我更喜欢在这里使用setdefault() 而不是defaultdict

      >>> 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']})
      

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2020-08-07
        • 2022-11-12
        • 1970-01-01
        • 2010-10-15
        • 2019-04-17
        相关资源
        最近更新 更多