【问题标题】:tuples to dictionary with two occurances字典中出现两次的元组
【发布时间】:2022-01-17 03:23:09
【问题描述】:

我的问题是如何在字典中转换两个元组,如果第一个元组中有两个相同的字符串,它会从第二个元组返回第一个元素:

例如

def tuples_to_dict(x,y):
    mydict= {}
    
    for k,v in zip(x,y):
        mydict[k]=v
    return mydict

tuples_to_dict(('a','b', 'c', 'a'), (1,2,3,4))

但是这个输出:

{'a': 4, 'b': 2, 'c': 3}

但我希望它是:

{'a': 1, 'b': 2, 'c': 3}

抱歉,如果这个问题太简单而无法坚持!我知道我必须在我的代码中添加更多内容,这就是为什么它返回我想要的错误输出的原因,我查看了其他资源,但它没有回答我的具体问题。我考虑过写一个if 声明并做x.count(k)>=1: 但是我不知道从那里去哪里。

【问题讨论】:

    标签: python dictionary tuples


    【解决方案1】:

    只需要进行一次额外检查即可查看该键是否已在字典中。

    def tuples_to_dict(x,y):
        mydict= {}
        
        for k,v in zip(x,y):
            if k not in mydict:
                mydict[k]=v
        return mydict
    

    【讨论】:

      【解决方案2】:

      以相反的顺序插入元素将达到您的需要:

      def tuples_to_dict(x, y):
          return dict(reversed(list(zip(x, y))))
      
      tuples_to_dict(('a', 'b', 'c', 'a'), (1, 2, 3, 4))
      

      输出

      {'a': 1, 'c': 3, 'b': 2}
      

      理想情况下,您应该检查两个列表的长度是否相同,以避免出现意外结果:zip 默认会截断为最短的列表。

      如果在压缩 beforeafter 压缩后反转可能会有争议,但我认为后者更好,原因如下 - 如果你传递不同长度的列表:

      x = ('a', 'b', 'c', 'a') 
      y = (1, 2, 3)
      
      dict(reversed(list(zip(x, y))))
      
      dict(zip(reversed(x), reversed(y)))
      

      输出

      {'c': 3, 'b': 2, 'a': 1}  # This is more in line with what I would expect
      {'a': 3, 'c': 2, 'b': 1} 
      

      在 Python 3.10 中,您可以强制 zip 抛出异常,以防压缩列表的长度不同(通过 strict=True),这样可以避免这方面的任何问题。

      【讨论】:

      • 这比我的+1完整多了。另外我认为,由于它们是序列类型,如果我们不想先迭代所有项目,len() 会很有帮助,这就是strict=True 所做的。对于大件物品,我会先检查长度,然后使用dict(zip(reversed(x), reversed(y)))。无需在两者之间建立临时列表。
      • @SorousHBakhtiary 是的,这应该是首选路线!感谢投票!
      猜你喜欢
      • 1970-01-01
      • 2020-03-10
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2021-03-13
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多