查找 python 字典中是否有不同的元素
Finding if there are distinct elements in a python dictionary
我有一个包含 n 个键值对的 python 字典,其中 n-1 个值相同,1 个不相同。我需要找到不同元素的键。
例如:考虑一个 python 列表 [{a:1},{b:1},{c:2},{d:1}]
。我需要得到 'c'
作为输出。
我可以使用一个 for 循环比较连续的元素,然后再使用两个 for 循环将这些元素与其他元素进行比较。但是有没有更有效的方法或者我不知道的内置函数?
如果您已经有了字典,那么您可以列出所有键: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
语句
如果您有字典,您可以快速检查并找到与围绕字典键循环的接下来两个值不同的第一个值。
这是一个例子:
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'
否则,如果你有一个单键字典列表,那么你可以很好地用一个函数映射你的列表,该函数 "extracts" 来自你的元素的值,然后检查每个使用同样的逻辑。
这是另一个工作示例:
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
函数不 return a list
字典的 .keys()
方法也没有。
假设你的"list of pairs"(实际上是词典列表,叹息)无法更改:
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]
我有一个包含 n 个键值对的 python 字典,其中 n-1 个值相同,1 个不相同。我需要找到不同元素的键。
例如:考虑一个 python 列表 [{a:1},{b:1},{c:2},{d:1}]
。我需要得到 'c'
作为输出。
我可以使用一个 for 循环比较连续的元素,然后再使用两个 for 循环将这些元素与其他元素进行比较。但是有没有更有效的方法或者我不知道的内置函数?
如果您已经有了字典,那么您可以列出所有键: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
语句
如果您有字典,您可以快速检查并找到与围绕字典键循环的接下来两个值不同的第一个值。
这是一个例子:
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'
否则,如果你有一个单键字典列表,那么你可以很好地用一个函数映射你的列表,该函数 "extracts" 来自你的元素的值,然后检查每个使用同样的逻辑。
这是另一个工作示例:
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
函数不 return a list
字典的 .keys()
方法也没有。
假设你的"list of pairs"(实际上是词典列表,叹息)无法更改:
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]