簡體   English   中英

使用列表作為字典鍵的 Python 替代方法?

[英]Python alternative to using List as Dictionary Key?

我目前有一個字典,可以將歸一化的互信息分數映射到多序列比對中的對齊位點,這些位點存儲在列表中。 但是,我意識到兩個列表可能恰好具有相同的分數。 因此只有一個列表將存儲在字典中,因為分數是關鍵。 集群應該是唯一的,所以我不確定該怎么做,因為我的列表沒有哈希函數。

這就是我的數據的樣子。 理想情況下,我只想反轉鍵和值。

{
0.475: [10, 11]
0.434: [12, 14]
0.404: [16, 18]
0.341: [21, 22]
}

你可以在這里使用字典的理解:

d = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [21, 22]}
print({tuple(d[n]):n for n in d})

輸出

{(10, 11): 0.475, (12, 14): 0.434, (16, 18): 0.404, (21, 22): 0.341}

您不能直接反轉鍵和值,因為列表是不可散列的,因此不能作為鍵保留。

更新

如果您有重復的列表,您可能希望創建重復列表的枚舉。 你可以這樣做:

from collections import defaultdict
d = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [12, 14]}
new_d = dict()
d_counts = defaultdict(int)
for n in d.keys():
    value = tuple(d[n])
    new_d[(value, d_counts[value])] = n
    d_counts[value] += 1
print(new_d)

輸出 2

{((10, 11), 0): 0.475, ((12, 14), 0): 0.434, ((16, 18), 0): 0.404, ((12, 14), 1): 0.341}
mydict = {0.475: [10, 11],
          0.434: [12, 14],
          0.404: [16, 18],
          0.341: [21, 22]}

newdict = dict()

for k, v in mydict.items():
    newdict[tuple(v)] = k

print(newdict)
# {(10, 11): 0.475, (12, 14): 0.434, (16, 18): 0.404, (21, 22): 0.341}

這個答案中,您可以嘗試從內置dict創建一個新類:

class Dictlist(dict):
    def __setitem__(self, key, value):
        try:
            self[key]
        except KeyError:
            super(Dictlist, self).__setitem__(key, [])
        self[key].append(value)

所以...

>>> d = Dictlist()
>>> d['100'] = [1, 2]
>>> d['100'] = [3, 4]
>>> d
{'100': [[1, 2], [3, 4]]}

字典理解應該沒有問題。

my_dict = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [21, 22]}

my_dict = {my_dict[k]:k for k in my_dict}

注意:如果你想在里面有一個if 語句,你可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM