首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找python字典中是否有不同的元素

查找python字典中是否有不同的元素
EN

Stack Overflow用户
提问于 2015-11-26 02:04:47
回答 3查看 219关注 0票数 2

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

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

我可以使用for循环来比较连续的元素,然后再使用两个for循环来比较这些元素和其他元素。但是,是否有更有效的方法来解决这个问题,或者是一个我不知道的内置功能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-26 02:41:41

如果您有一个字典,您可以快速地检查并找到第一个值,这与接下来的两个值循环在字典的键之间是不同的。

下面是一个例子:

代码语言:javascript
运行
复制
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'

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

下面是另一个工作示例:

代码语言:javascript
运行
复制
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'

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

票数 2
EN

Stack Overflow用户

发布于 2015-11-26 03:07:29

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

代码语言:javascript
运行
复制
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]
票数 1
EN

Stack Overflow用户

发布于 2015-11-26 02:36:33

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

代码语言:javascript
运行
复制
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语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33929498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档