python中字典的键是唯一的吗_在python3中反转字典中的键和值(值不唯一)
我知道當值是唯一的時,如何簡單地在字典中反轉鍵和值.
但是當值不唯一時如何反轉.
根據要求,如果值出現不止一次,我需要使用set來將它們組合在一起.
防爆.輸入d = {‘a’:1,’b’:2,’c’:1,’d’:2}輸出d = {1,{‘a’,’c’},2,{‘b’ ,’C’}}
我在下面編寫了相當愚蠢的代碼,但因為我只創建了一個集合,因此所有顯示多次的值都在該集合中.
def change(d):
inverted_l = list(map(lambda t:(t[1],t[0]), d.items()))
store_key = [] #for store the key to check if value appear more than one
new_d = {}
x = set()
for i in range(len(inverted_l)):
store_key.append(inverted_l[i][0])
for i in range(len(store_key)):
if store_key.count(store_key[i])> 1:
x.add(inverted_l[i][1]) #I think the problem is I need create set
#each time, but I don't know how to do that
new_d[store_key[i]] = x
else:
new_d[store_key[i]] = inverted_l[i][1]
return new_d
print(sorted(change({'a':1, 'b':2, 'c':1,'d':2}).items()))
我錯誤的輸出是[(1,{‘c’,’d’,’b’,’a’}),(2,{‘c’,’d’,’b’,’a’})]但是我需要[(1,{‘a’,’c’}),(2,{‘b’,’d’})]
補充:我嘗試你的代碼,但是當我測試print時發生錯誤(sorted(invert_dict({‘a’:1,’b’:2,’c’:1}).items()))
我希望我的結果是[(1,{‘a’,’c’}),(2,’b’)]
我是python的新手,謝謝你的幫助和時間!
def invert_dict(d):
result = {}
for k in d:
if d[k] not in result:
result[d[k]] = set()
result[d[k]].add(k)
return {k: d[k] if len(d[k])>1 else d[k].pop() for k in d}
Traceback (most recent call last):
File "U:\test.py", line 9, in
print(sorted(invert_dict({'a':1, 'b':2, 'c':1}).items()))
File "U:\test.py", line 7, in invert_dict
return {k: d[k] if len(d[k])>1 else d[k].pop() for k in d}
File "U:\test.py", line 7, in
return {k: d[k] if len(d[k])>1 else d[k].pop() for k in d}
TypeError: object of type 'int' has no len()
解決方法:
我很確定你的意思是所需的輸出不是設定的
d = {1,{'a','c'},2,{'b','c'}}
而是字典
d = {1:{'a','c'}, 2:{'b','c'}}
只需仔細檢查一下:-).
無論如何,我會這樣做:
import collections
def invert_dict(d):
result = collections.defaultdict(set)
for k in d:
result[d[k]].add(k)
return dict(result)
如果dict子類defaultdict正常,則返回可以簡化為返回結果 – 如果規范非常嚴格,則只需要將其轉換為dict.
我想下一步可??能是“oops,不允許導入”禁止集合.defaultdict,所以我預計 – 在這種情況下,請改為(例如)
def invert_dict(d):
result = {}
for k in d:
if d[k] not in result:
result[d[k]] = set()
result[d[k]].add(k)
return result
補充:顯然最新版本是至關重要的(OP當然“忘記”首先添加“無導入”約束 – 為什么他們繼續對我這樣做?!它會花費他們任何東西來揭示所有的限制從他們的Qs開始前面?!?!?!!)但是需要進行調整 – 單例集需要轉換成他們唯一元素的非集合(一個可怕的,可怕的,不好的規范,使得結果字典幾乎無法使用,并且讓我強烈希望對那些似乎相信制作令人作嘔的糟糕規格改善他們的教學的沒有好詞的人有一些尖銳的話語,但是,這是另一種咆哮).
無論如何,最好是添加一個后處理步驟:
def invert_dict(d):
result = {}
for k in d:
if d[k] not in result:
result[d[k]] = set()
result[d[k]].add(k)
return {k: d[k] if len(d[k])>1 else d[k].pop() for k in d}
沒有什么比這更難了:只需將“解開”單件套裝設置為帶有彈出的一個項目. (接下來是什么 – 另一個愚蠢的任意約束的遲來的啟示,例如“no if / else表達式”?! – )
添加(保留上面的錯誤代碼):需要在return語句中清楚地使用結果而不是d!即最后一行必須是
return {k: result[k] if len(result[k])>1 else result[k].pop() for k in result}
標簽:python,python-3-x,dictionary,duplicates,key-value
來源: https://codeday.me/bug/20190830/1766078.html
總結
以上是生活随笔為你收集整理的python中字典的键是唯一的吗_在python3中反转字典中的键和值(值不唯一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用yum命令安装mysql_Linux
- 下一篇: 农委系统先进集体推荐报告_来自司法行政的