【问题标题】:How do I unpack tuple which is a dictionary keys to create another dictionary?如何解压缩作为字典键的元组以创建另一个字典?
【发布时间】:2019-10-27 18:02:03
【问题描述】:

我有一个以元组作为键的字典,我试图解包元组以创建另一个字典,但没有得到令人满意的结果。

daily_sales = {('naze', 'umuakali'): 6,('peter', 'umuorie'): 1, 
               ('eze','nekede'): 16}

我想要的是另一本字典,比如

send_to_manag = {{'village': 'naze', 'market':'umuakali', 'sales': 6},
                {'village': 'peter', 'market':'umuorie', 'sales': 1},...}

对于字典中的每个项目

我试过了

send_to_manag = {}
for village,market,sales in daily_sales.items():
    send_to_manag['village'] = daily_sales[0][0][0]
    send_to_manag['market'] = daily_sales[0][0][1]
    send_to_manag['sales'] = daily_sales[0][1]

它给了

KeyError: 0

【问题讨论】:

  • 你的 send_to_manag 不是字典 - 你不会明白,也许列表是有意的?
  • 字典不能作为另一个字典的键,所以你想要的是不可能的。
  • 对不起,伙计们,我的注意力非常非常差,但这让我在 48 小时内无法入睡,不知如何去做。我现在不太擅长python,但我也知道我可以在这里找到帮助,这就是我来的原因。但实际上这不是我在这里简化它的想法,因为我知道如果这个在这里工作,它会在任何地方工作,我正在查看 414,769 dict 项目进行迭代。我很高兴有你们,谢谢它的工作。
  • 我刚刚发现,当事情太大时,从小处着手会很有帮助,我这里的字典实在是太大了太吓人了,但是当我想在这里发布时,或者如果我把它原封不动地发布在这里,你们会杀了我,所以我做了一个我想要的简化版本......爱你们所有人的帮助。

标签: python dictionary tuples key


【解决方案1】:

只需 dict/list 理解:

res = [{'village': t[0], 'market': t[1], 'sales': s} for t, s in daily_sales.items()]
print(res)

输出:

[{'market': 'umuakali', 'sales': 6, 'village': 'naze'},
 {'market': 'umuorie', 'sales': 1, 'village': 'peter'},
 {'market': 'nekede', 'sales': 16, 'village': 'eze'}]

【讨论】:

    【解决方案2】:

    元组可以是键,因为它们是不可变的。但是,它们仍然像普通的元组一样 - 可以通过索引访问。 IE。 _tuple[0] 用于第一个索引,_tuple[1] 用于第二个。

    您想要的第三个值是由元组键控的字典值。所以你只是把它当作一个价值。

    daily_sales = {('naze', 'umuakali'): 6,
                   ('peter', 'umuorie'): 1, 
                   ('eze','nekede'): 16
                   }
    
    send_to_manag = [] # Create a new list (the dict in your example output won't work, because you don't have keys associated with the sub-dicts
    for k,v in daily_sales.items(): # Get key and value from each item in daily_sales
        village = k[0] # Get the first item form the key tuple
        market = k[1] # Get the second item form the key tuple
        sales = v # Sales is the value associated with the key tuple
        # Now append it to the new list
        send_to_manag.append({'village': village, 'market':market, 'sales': sales})
    
    print(send_to_manag )
    

    输出:

    [{'village': 'naze', 'market': 'umuakali', 'sales': 6}, 
    {'village': 'peter', 'market': 'umuorie', 'sales': 1}, 
    {'village': 'eze', 'market': 'nekede', 'sales': 16}]
    

    【讨论】:

      【解决方案3】:

      正如我在评论中所说,字典不能用作另一个字典中的键。但是,您可以获得类似于您所说的想要的字典列表,如下所示:

      from pprint import pprint
      
      daily_sales = {('naze', 'umuakali'): 6,
                     ('peter', 'umuorie'): 1,
                     ('eze','nekede'): 16}
      
      send_to_manag = []
      for (village, market), sales in daily_sales.items():
          send_to_manag.append({'village': village, 'market': market, 'sales': sales})
      
      pprint(send_to_manag)
      

      打印结果:

      [{'market': 'umuakali', 'sales': 6, 'village': 'naze'},
       {'market': 'umuorie', 'sales': 1, 'village': 'peter'},
       {'market': 'nekede', 'sales': 16, 'village': 'eze'}]
      

      【讨论】:

        【解决方案4】:
        send_to_management = [ { 'village': key[ 0 ], 'market': key[ 1 ], 'sales': value } for key, value in daily_sales.items() ]
        
        >>> [{'village': 'naze', 'market': 'umuakali', 'sales': 6}, {'village': 'peter', 'market': 'umuorie', 'sales': 1}, {'village': 'eze', 'market': 'nekede', 'sales': 16}]
        

        我不想这么说,但是您在上面发布的代码表明对字典的工作原理非常了解。

        for village,market,sales in daily_sales.items():
        

        也就是说,您上面的代码对字典的工作原理非常缺乏了解。我不想刻薄,但是这几行代码有太多错误,我无法正确讨论。

        我强烈建议您深入研究字典的工作原理,因为它们对于处理代码至关重要。

        此外,生成器表达式(和正则表达式)是您的朋友。学习它们。

        【讨论】:

          猜你喜欢
          • 2017-03-27
          • 2017-07-05
          • 2017-04-25
          • 1970-01-01
          • 1970-01-01
          • 2012-10-19
          • 1970-01-01
          • 2016-10-05
          • 2014-06-17
          相关资源
          最近更新 更多