检查字典中的唯一值并返回一个列表

问题描述:

我一直在为这个练习挣扎几天,现在我发现每个近似值都有一个新问题,其思想是在字典上找到这些唯一值,并返回一个列表的钥匙检查字典中的唯一值并返回一个列表

例如: 如果aDictionary = {1: 1, 3: 2, 6: 0, 7: 0, 8: 4, 10: 0}那么你的函数应该返回[1, 3, 8],作为值1,2和4只出现一次。

这是我到目前为止已经试过:

def existsOnce(aDict): 

counting = {} 
tempList = [] 

for k in aDict.keys(): 
    print k, 
    print aDict[k] 


print 'values are:' 
for v in aDict.values(): 
    print v, 
    counting[v] = counting.get(v,0)+1 
    print counting[v] 
    tempNumbers = counting[v] 
    tempList.append(tempNumbers) 
print tempList 

如果我走这条路,我可以指出,并删除那些比一个大,但问题仍然存在,我将有一个零,我不想要它,因为在原始列表中不是唯一的。

def existsOnce2(aDict): 

# import Counter module in the top with `from collections import Counter` 

c = Counter() 

for letter in 'here is a sample of english text': 
    c[letter] += 1 
    if c[letter] == 1: 
     print c[letter],':',letter 

我试图用整数去检查哪些是从第一次出现,但不能将它翻译成字典或继续从这里出发。此外,我不确定导入模块是否允许在答案中,并且肯定必须是一种无需外部模块的方式。

def existsOnce3(aDict): 

    vals = {} 
    for i in aDict.values(): 
     for j in set(str(i)): 
      vals[j] = 1+ vals.get(j,0) 
    print vals 

    '''till here I get a counter of how many times a value appears in the original dictionary, now I should delete those bigger than 1''' 
    temp_vals = vals.copy() 
    for x in vals: 
     if vals[x] > 1: 
      print 'delete this: ', 'key:',x,'value:', vals[x] 
      temp_vals.pop(x) 
     else: 
      pass 
    print 'temporary dictionary values:', temp_vals 
    '''till here I reduced down the values that appear once, 1, 2 and 4, now I would need the go back and check the original dictionary and return the keys 
     Original dictionary: {1: 1, 3: 2, 6: 0, 7: 0, 8: 4, 10: 0} 
     temp_vals {'1': 1, '2': 1, '4': 1} 
     keys on temp_vals (1,2,4) are the values associated to the keys I got to retrieve from original dictionary (1,3,8) 
    ''' 
    print '---' 

    temp_list = [] 
    for eachTempVal in temp_vals: 
     temp_list.append(eachTempVal) 
    print 'temporary list values:', temp_list 
    ''' till here I got a temporary list with the values I need to search in aDict''' 
    print '---' 
    for eachListVal in temp_list: 
     print 'eachListVal:', eachListVal 
     for k,v in aDict.iteritems(): 
      print 'key:',k,'value:',v 

在这里,我可以不承担任何原因的值并加以比较,我已经试过类似语句来提取值:

if v == eachListVal: 
    do something 

但我做错了什么和不可以访问到价值。

+0

如果值是不可变的创建通过在第一,其中在所述第二字典的值的计数的值键控第二字典它们出现在第一个字典中的次数。从那里一行代码返回你想要的列表。它应该全部适合最多6行代码。 –

你只需要使用您的vals字典,并保持键从aDict与有丘壑一个count == 1然后调用排序得到有序输出列表值:

def existsOnce3(aDict): 
    vals = {} 
    # create dict to sum all value counts 
    for i in aDict.values(): 
     vals.setdefault(i,0) 
     vals[i] += 1 
    # use each v/val from aDict as the key to vals 
    # keeping each k/key from aDict if the count is 1 
    return sorted(k for k, v in aDict.items() if vals[v] == 1) 

使用collections.Counter字典做计数只是调用计数器上的值,然后套用同样的逻辑,只要保持有AV计数== 1从柜台字典每个k:

from collections import Counter 
cn = Counter(aDict.values()) 
print(sorted(k for k,v in aDict.items() if cn[v] == 1)) 
+0

太棒了!我仍然不完全明白这一行:'如果vals [v] == 1)'返回排序(k代表k,v代表aDict.items())。任何有用的链接到文档? – gma992

+1

@ gma992,它只是将键从最低到最高排序,以保证您获得所需的顺序,字典无序,所以不保证您在不调用排序的情况下得到'[1,3,8]''。 https://wiki.python.org/moin/HowTo/Sorting如果在val中返回'v'的值,'if vals [v] == 1'确保我们只保留其值不重复的键字典不是'1',那么我们知道它不是一个唯一的值 –

如何:

from collections import Counter 

my_dict = {1: 1, 3: 2, 6: 0, 7: 0, 8: 4, 10: 0} 

val_counter = Counter(my_dict.itervalues()) 
my_list = [k for k, v in my_dict.iteritems() if val_counter[v] == 1] 

print my_list 

结果:

[1, 3, 8] 
+0

'[k for k,v in my_dict。items()如果val_counter [v] == 1]',不需要先创建'uniques' – yangjie

+0

@yangjie,是的,你是对的。 – Akavall

一个衬里:

>>> aDictionary = {1: 1, 3: 2, 6: 0, 7: 0, 8: 4, 10: 0} 
>>> unique_values = [k for k,v in aDictionary.items() if list(aDictionary.values()).count(v)==1] 
>>> unique_values 
[1, 3, 8] 
+1

这是使用OP的字典方法与O(n)相反的二次方 –