【问题标题】:List of values for duplicate keys in dictionary Python字典 Python 中重复键的值列表
【发布时间】:2013-09-21 00:55:07
【问题描述】:

如果这里已经探讨过这个问题,请提前道歉 - 我在这里查看了不同的答案,但找不到我需要的。

我的目标是创建一个这样的字典 -- {'a':[10, 9, 10, 10], 'b':[10, 9, 1, 0], 'c':[0, 5, 0, 1], and so on}

我拥有的是具有重复键的多个字典(每个其他字典中的键相同),像这样 {'a':10, 'b': 0, 'c': 2} {'a':7, 'b': 4, 'c': 4} {'a':4, 'b': 5, 'c': 3}

我无法知道此类字典的数量,或者是否有直到“f”或“g”的键,但我知道这些键是重复的。我试过defaultdict 但我得到的是--

defaultdict(<type 'list'>, {'a': [10]})
defaultdict(<type 'list'>, {'a': [10], 'b': [3]})
defaultdict(<type 'list'>, {'a': [10], 'b': [3], 'c': [0]})

然后下一个字典也一样--

defaultdict(<type 'list'>, {'a': [4]})
defaultdict(<type 'list'>, {'a': [4], 'b': [5]})
defaultdict(<type 'list'>, {'a': [4], 'b': [5], 'c': [1]})

上面输出的代码是--

d = collections.defaultdict(list)
    for k, v in z.iteritems():
        d[k].append(v)
        c = d.items()
        print d

如果我改为使用print c(打印d.items()),我会得到--

[('a', [10])]
[('a', [10]), ('b', [3])]
[('a', [10]), ('c', [0]), ('b', [3])]

再次为每个字典重复。如何获得 1 个 dict 保存所有键、值 -

{'a':[10,0,..], 'b':[4, 3, 4,..], etc.} ?

我还应该补充一点,我拥有的 dicts 是 for 循环的结果,而不是单独存储在唯一变量中。

【问题讨论】:

    标签: python dictionary key duplicates defaultdict


    【解决方案1】:

    另一种方法是初始化一个字典,然后用字典中的唯一键及其对应值填充它,而不会覆盖现有值。 脚步: 1. 初始化一个空字典(比如key_values)来存储所需的键值对 2.遍历dicts的原始列表 3. 一次输出一个命令 4. 如果 key 尚未添加到 key_values 字典中,请添加 key 并将其 value 添加到列表中;否则,将value 附加到现有键的值(这是一个列表)。

    list_of_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}]
    key_values = {}
    
    for d in list_of_dicts:
        for k,v in d.iteritems():
            if k in key_values.keys():
                key_values[k].append(v)
            else:    
                key_values[k]=[v]
    
    print key_values #prints out: {'a': [10, 7, 4], 'c': [2, 4, 3], 'b': [0, 4, 5]}
    

    【讨论】:

      【解决方案2】:

      这是你需要的吗?

      in_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}]
      out_dict = {}
      
      for in_d in in_dicts:
        for k, v in in_d.iteritems():
          out_dict.setdefault(k, []).append(v)  
      print out_dict
      

      {'a': [10, 7, 4], 'c': [2, 4, 3], 'b': [0, 4, 5]}

      【讨论】:

      • 是的。谢谢。但我收到了for k, v in in_d.iteritems(): AttributeError: 'str' object has no attribute 'iteritems'。一旦我弄清楚了,我就可以走了(我想)。
      • 我猜你的输入是这样的...... ["{'a': 10, 'b': 0, ...}", ...]。所以,字典是以字符串的形式出现的,需要先转换成真正的字典。
      • 感谢@jcfollower - 这至少让我走上了解开谜团的正确轨道。但是当我尝试上面链接中提供的解决方案时,我收到了一个“格式错误的字符串”错误,我在这里问过 - stackoverflow.com/questions/18837217/…
      【解决方案3】:

      如果我正确理解您的观点,您正在尝试合并各种字典。使用内置插件的一种方式(我相信很快有人会给你一个numpycollections 答案)可能如下所示:

      ds = [
          {'a':10, 'b': 0, 'c': 2},
          {'a':7, 'b': 4, 'c': 4},
          {'a':4, 'b': 5, 'c': 3} ]
      
      merged = {}
      for d in ds:
          for k, v in d.items ():
              if k not in merged: merged [k] = []
              merged [k].append (v)
      
      print (merged)
      

      (为了清楚起见,相当冗长)

      编辑: 在阅读了您的评论“我想要的结果是值/键列表。”之后,您可以在生成的合并字典上使用它:

      print ( [ (v, k) for k, v in merged.items () ] )
      

      这会产生:

      [([10, 7, 4], 'a'), ([2, 4, 3], 'c'), ([0, 4, 5], 'b')]
      

      【讨论】:

      • 我认为字典本身是单独的字符串。当我运行您的解决方案时,我得到 - for k, v in d.items(): AttributeError: 'str' object has no attribute 'items'。让我看看是否可以删除引号 - d = d[1:-1] 没有帮助。
      • 您的输入可能是 JSON 吗?如果是,您应该使用json 模块来阅读它。
      【解决方案4】:

      这是一种思考方式:

      给定 Python 中的字典,您可以通过 dictionary[key] 访问 value。 在您的情况下,字典的值是列表。

      所以你可以想出一个函数来获取一个键,看看它是否已经存在于你的字典中,如果存在,只需将值附加到字典中。例如:

      说这是你当前的字典:

      d = { 'a':[3, 17], 'b':[2, 4] }
      

      你有这些数据要解析:

      data0 = { 'a':10, 'b':2, 'c':2 }
      

      由于键 'a' 已经存在,您希望获取 data0['a'] 的值并通过 d['a'].append(data0['a']) 附加到 d

      如果您需要任何进一步的说明,请告诉我这有帮助!

      • 麦克巴

      【讨论】:

      • 要明确一点——目前我有许多字典,每个字典都有一个唯一的值/键(& 不是值/键的列表),但键在每个其他字典中都重复。我想要的结果是值/键的列表。此外,我不知道有多少字典或键/字典。抱歉,但从措辞中不确定您是否解决了问题。也是这个意思。我想我还应该补充一点,我拥有的 dicts 是 for 循环的结果,而不是单独存储在唯一变量中。
      • 是的,即使在这种情况下,这个解决方案也肯定会起作用。你只需要运行:if key in dict: dict[key].append(data0[key]) else: dict[key] = data0[key]
      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 2013-05-22
      • 2021-01-01
      • 2019-01-16
      • 2012-01-24
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多