【问题标题】:Finding if there are distinct elements in a python dictionary查找python字典中是否有不同的元素
【发布时间】:2015-11-26 02:04:47
【问题描述】:

我有一个包含 n 个键值对的 python 字典,其中 n-1 个值是相同的,而 1 个不是。我需要找到不同元素的键。

例如:考虑一个python列表[{a:1},{b:1},{c:2},{d:1}]。我需要得到'c' 作为输出。

我可以使用一个 for 循环来比较连续的元素,然后再使用两个 for 循环来将这些元素与其他元素进行比较。但是有没有更有效的方法来解决它,或者可能是我不知道的内置函数?

【问题讨论】:

  • 我可以通过稍微修改此代码找到答案。 stackoverflow.com/questions/1032281/…
  • 如果 n-1 个值相同,则只需要一个 for 循环。只要你看到两个不同的值,你就知道是哪一个了。
  • @El'endiaStarman 好点——尽管如果唯一的一个是前两个之一,在看到第三个元素之前你不会知道它是哪一个。
  • @JohnColeman:确实如此!这是我发表评论后想到的一个警告......
  • 您的描述(字典)与您的示例不匹配(字典列表,每个包含一个键/值。)

标签: python dictionary python-2.x


【解决方案1】:

如果您有字典,您可以快速检查并找到第一个值,该值与围绕字典键循环的下两个值不同。

这是一个例子:

def find_different(d):
    k = d.keys()
    for i in xrange(0, len(k)):
        if d[k[i]] != d[k[(i+1)%len(k)]] and d[k[i]] != d[k[(i+2)%len(k)]]:
            return k[i]

>>> mydict = {'a':1, 'b':1, 'c':2, 'd':1}
>>> find_different(mydict)
'c'

否则,如果您拥有的是单键字典列表,那么您可以很好地使用从元素中“提取”值的函数映射您的列表,然后使用相同的逻辑检查每一个。

这是另一个工作示例:

def find_different(l):
    mask = map(lambda x: x[x.keys()[0]], l)
    for i in xrange(0, len(l)):
        if mask[i] != mask[(i+1)%len(l)] and mask[i] != mask[(i+2)%len(l)]:
            return l[i].keys()[0]

>>> mylist = [{'a':1},{'b':1},{'c':2},{'d':1}]
>>> find_different(mylist)
'c'

注意:这些解决方案在 Python 3 中不起作用,因为 map 函数不返回 list 并且字典的 .keys() 方法也不返回。

【讨论】:

    【解决方案2】:

    假设您的“对列表”(实际上是字典列表,sigh)无法更改:

    from collections import defaultdict
    
    def get_pair(d):
        return (d.keys()[0], d.values()[0])
    
    def extract_unique(l):
        d = defaultdict(list)
        for key, value in map(get_pair, l):
            d[value].append(key)
        return filter(lambda (v,l): len(l) == 1, d.items())[0][1]
    

    【讨论】:

      【解决方案3】:

      如果您已经有了字典,那么您可以列出所有键:key_list = yourDic.keys()。使用该列表,您可以循环浏览您的字典。如果您知道其中一个值,这会更容易,但下面我假设您不知道。

      yourDic = {'a':1, 'b':4, 'c':1, 'd':1, }
      key_list = yourDic.keys()
      previous_value = yourDic[key_list[0]] # Making it so loop gets past first test
      count = 0
      for key in key_list:
          test_value = yourDic[key]
          if (test_value != previous_value) and count == 1: # Checks first key
              print key_list[count - 1]
              break
          elif (test_value != previous_value):
              print key
              break
          else:
              previous_value = test_value
              count += 1
      

      所以,一旦你找到不同的值,它就会打印出密钥。如果你也想让它打印值,你只需要一个print test_value 语句

      【讨论】:

      • 这在很多层面上都是错误的:首先,OP 没有谈论字典,而是谈论字典列表;那么您正在检查每个项目及其右兄弟,因此如果不同的元素是列表中的第一个元素,您的方法将无法正确识别它。
      • 我复制并粘贴了前一个。它已经被修复了。哦,OP的示例有一个列表,但是专门询问了“包含n个键值对的python字典”,并且问题的标题特别提到了字典,所以这就是我回答的问题
      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 2015-04-02
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多