【问题标题】:Python3 dictionary merge based on values基于值的Python3字典合并
【发布时间】:2017-03-03 19:00:12
【问题描述】:

我有一本由{key: value}组成的字典。

我从这个字典中选择一组键。

我想用{keyA: set of all keys wich have the same value as keyA} 建立一个新字典。

我已经有了解决方案:有更快的方法吗?

这对我来说似乎很慢,而且我想我不是唯一一个遇到这种情况的人!

for key1 in selectedkeys:
    if key1 not in seen:
        seen.add(key1)
        equal[key1] = set([key1])#egual to itself
        for key2 in selectedkeys:
            if key2 not in seen and dico[key1] == dico[key2]:
                equal[key1].add(key2)
        seen.update(equal[key1])

【问题讨论】:

  • 你能举个例子输入输出吗?
  • 建立一个映射{value: set(keys)}的字典可能会更快。

标签: python python-3.x dictionary merge


【解决方案1】:

试试这个

>>> a = {1:1, 2:1, 3:2, 4:2}
>>> ret_val = {}
>>> for k, v in a.iteritems():
...     ret_val.setdefault(v, []).append(k)
...
>>> ret_val
{1: [1, 2], 2: [3, 4]}

【讨论】:

    【解决方案2】:
    def convert(d):
        result = {}
        for k, v in d.items():  # or d.iteritems() if using python 2
            if v not in result:
                result[v] = set()
            result[v].add(k)
        return result
    

    如果您足够小心,以后不要访问任何非密钥,则只需使用collections.defaultdict(set) :-)

    【讨论】:

      【解决方案3】:

      因此,您希望为给定源字典中的每个选定键创建一个字典,将key 映射到“与key 具有相同值的所有键的集合”。

      因此,如果源字典是:

      {'a': 1, 'b': 2, 'c': 1, 'd': 2, 'e': 3, 'f': 1, 'g': 3)
      

      并且选择的键是abe,结果应该是:

      {'a': {'a', 'c', 'f'}, 'e': {'g', 'e'}, 'b': {'b', 'd'}}
      

      实现此目的的一种方法是使用defaultdict 为键表构建一个值,然后使用它从指定的键构建所需的结果:

      from collections import defaultdict
      
      def value_map(source, keys):
          table = defaultdict(set)
          for key, value in source.items():
              table[value].add(key)
          return {key: table[source[key]] for key in keys}
      
      source = {'a': 1, 'b': 2, 'c': 1, 'd': 2, 'e': 3, 'f': 1, 'g': 3)
      
      print(value_map(source, ['a', 'b', 'e']))
      

      输出:

      {'a': {'a', 'c', 'f'}, 'e': {'g', 'e'}, 'b': {'b', 'd'}}
      

      【讨论】:

      • 这比我做的要快得多。我认为会有一个选项使用类似计数器库的东西,它们可以快速退出!
      【解决方案4】:

      因为您从原始字典中选择了一组键。我们可以根据您的目的修改@Nilesh 解决方案。

      a = {1:1, 2:1, 3:2, 4:2}
      keys = [1, 3]  # lets say this is the list of keys
      ret_val = {}
      for i in keys:
        for k,v  in a.items():
          if a[i]==v:
            ret_val.setdefault(i, []).append(k)
      print (ret_val)
      
      {1: [1, 2], 3: [3, 4]}
      

      【讨论】:

        【解决方案5】:

        @Patrick Haugh 在 cmets 中有这样的表述:

        d=your dictionary
        s=set(d.values())
        d2={i:[] for i in s}
        for k in d:
            d2[d[k]].append(k)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多