【问题标题】:How to compare values inside a dictionary to fill up sets()如何比较字典中的值以填充集合()
【发布时间】:2014-03-24 19:24:33
【问题描述】:
dico = {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calculer",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"changer"}}

我有一本像这样的大字典。我想将相同的元素组合在一起。所以创建一种条件,如果"dico" 的值相等,则将它们放在set() 中:

b=[set(1,2,7,9),set(3),set(4,5),set(6,11),set(8),set(10),set(12)]

我不知道这个问题是否已经被问过,但作为一个新的pythonner,我没有所有的钥匙...... ^^

谢谢你的回答

【问题讨论】:

标签: python python-3.x dictionary set


【解决方案1】:

我会反转你的字典,得到一个set() 的值,然后返回所有的值。

>>> from collections import defaultdict
>>>>my_dict= {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calculer",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"changer"}}
>>> my_other_dict = defaultdict(set)
>>> for dict_name,sub_dict in my_dict.iteritems():
    for k,v in sub_dict.iteritems():
        my_other_dict[v].add(k) #the value, i.e. "bailler" is now the key
                                 #e.g. {"bailler":set([1,2,9,7]),...


>>> [v for k,v in my_other_dict.iteritems()]
[set([8]), set([1, 2, 9, 7]), set([3]), set([4, 5]), set([12]), set([11, 6]), set([10])]

当然,正如 cynddl 所指出的,如果您在列表中的索引始终是“键”,只需枚举一个列表,您就不必将原始数据存储为字典,也不必使用 sets() 作为索引是独一无二的。

【讨论】:

    【解决方案2】:

    你应该这样写你的数据:

    dico = ["bailler", "bailler", "percer", "calculer", "calculer", "trouer", "bailler", "découvrir", "bailler", "miser", "trouer", "changer"]
    

    如果要计算相同元素的数量,请使用collections.Counter

    import collections
    counter=collections.Counter(dico)
    print(counter)
    

    它返回一个Counter 对象:

    Counter({'bailler': 4, 'calculer': 2, 'trouer': 2, 'd\xc3\xa9couvrir': 1, 'percer': 1, 'changer': 1, 'miser': 1})
    

    【讨论】:

      【解决方案3】:

      dict.setdefault() 方法可以很方便地完成此类任务,dict.items() 可以遍历字典的 (key, value) 对。

      >>> dico = {"dico":   {1:"bailler",2:"bailler",3:"percer",4:"calculer",5:"calcul
      er",6:"trouer",7:"bailler",8:"découvrir",9:"bailler",10:"miser",11:"trouer",12:"
      changer"}}
      >>> newdict = {}
      >>> for k, subdict in dico.items():
      ...     newdict[k] = {}
      ...     for subk, subv in subdict.items():
      ...         newdict[k].setdefault(subv, set()).add(subk)
      ...
      >>> newdict
      {'dico': {'bailler': {1, 2, 9, 7}, 'miser': {10}, 'découvrir': {8}, 'calculer':
      {4, 5}, 'changer': {12}, 'percer': {3}, 'trouer': {11, 6}}}
      >>> newdict['dico'].values()
      dict_values([{1, 2, 9, 7}, {10}, {8}, {4, 5}, {12}, {3}, {11, 6}])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2019-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多