检查字典中的唯一值并返回lis

2024-04-25 09:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在这个练习中挣扎了几天了,我发现的每个近似值都有一个新问题,我的想法是在字典中找到那些唯一的值,并返回一个带有键的列表

例如: 如果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

如果我这样做,我可以指出并删除那些大于1的,但问题仍然存在,我将有一个零,我不希望它在原始列表中不是唯一的。

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

但我做错了,无法获得价值观。


Tags: theinfordictionaryherekeystemplist
3条回答

您只需使用valsdict,并将键与vals中具有count == 1值的aDict保持在一起,然后调用sorted以获取排序的输出列表:

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 dict进行计数只需对值调用Counter,然后应用相同的逻辑,只需保留Counter dict中v count==1的每个k:

from collections import Counter
cn = Counter(aDict.values())
print(sorted(k for k,v in aDict.items() if cn[v] == 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]

一行:

>>> 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]

相关问题 更多 >