我想映射一个以字典作为输入并返回键列表的函数。 列表中的键必须只是字典中的唯一值。
所以,这就是我所做的。
bDict={}
for key,value in aDict.items():
if bDict.has_key(value) == False:
bDict[value]=key
else:
bDict.pop(value,None)
这是输出:
>>> aDict.keys()
Out[4]: [1, 3, 6, 7, 8, 10]
>>> aDict.values()
Out[5]: [1, 2, 0, 0, 4, 0]
>>> bDict.keys()
Out[6]: [0, 1, 2, 4]
>>> bDict.values()
Out[7]: [10, 1, 3, 8]
但是,预期输出应为bDict.values()
:[*1,3,8*]
答案 0 :(得分:1)
这可能会有所帮助。
的 CODE 强>
aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0, 11:0}
bDict = {}
for i,j in aDict.items():
if j not in bDict:
bDict[j] = [i]
else:
bDict[j].append(i)
print map(lambda x: x[0],filter(lambda x: len(x) == 1,bDict.values()))
<强>输出强>
[1, 3, 8]
答案 1 :(得分:1)
所以看起来你正在创建一个新的字典,其中键和值被反转,保持对的值是唯一的。您可以先找出哪些项目是唯一的,然后再建立一个字典。
def distinct_values(d):
from collections import Counter
counts = Counter(d.itervalues())
return { v: k for k, v in d.iteritems() if counts[v] == 1 }
这产生以下结果:
>>> distinct_values({ 1:1, 3:2, 6:0, 7:0, 8:4, 10:0 })
{1: 1, 2: 3, 4: 8}
答案 2 :(得分:0)
这是一个解决方案(使用两个版本的aDict
来测试另一个解决方案失败的rand案例):
#aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0}
aDict = { 1:1, 3:2, 6:0, 7:0, 8:4, 10:0, 11:2}
seenValues = {}
uniqueKeys = set()
for aKey, aValue in aDict.items():
if aValue not in seenValues:
# Store the key of the value, and assume it is unique
seenValues[aValue] = aKey
uniqueKeys.add(aKey)
elif seenValues[aValue] in uniqueKeys:
# The value has been seen before, and the assumption of
# it being unique was wrong, so remove it
uniqueKeys.remove(seenValues[aValue])
print "Remove non-unique key/value pair: {%d, %d}" % (aKey, aValue)
else:
print "Non-unique key/value pair: {%d, %d}" % (aKey, aValue)
print "Unique keys: ", sorted(uniqueKeys)
这会产生输出:
删除非唯一键/值对:{7,0}
非唯一键/值对:{10,0}
删除非唯一键/值对:{11,2}
唯一键:[1,8]
或使用aDict
的原始版本:
删除非唯一键/值对:{7,0}
非唯一键/值对:{10,0}
唯一键:[1,3,8]
答案 3 :(得分:0)
作为python 2.7 one-liner,
[k for k,v in aDict.iteritems() if aDict.values().count(v) == 1]
注意上面的
aDict.values()
,对字典中的每个条目调用一次,aDict.values().count(v)
。如果字典很小,这不是问题。如果字典不小,则创建和销毁这些重复列表以及对count()
的重复调用可能代价高昂。缓存adict.values()
的值可能会有所帮助,它也可能有助于创建一个字典,将字典中的值映射到出现次数作为字典条目值。