我有一个字典,其中键是一个列表
cfn = {('A', 'B'): 1, ('A','C'): 2 , ('A', 'D'): 3}
genes = ['A', 'C', 'D', 'E']
我试图从字典中获得一个值,如果在关键的基因对存在于一个列表在一起。我的尝试如下,但我得到TypeError: unhashable type: 'list'
def create_networks(genes, cfn):
network = list()
for i in range(0, len(genes)):
for j in range(1, len(genes)):
edge = cfn.get([genes[i], genes[j]],0)
if edge > 0:
network.append([genes[i], genes[j], edge])
所需输出:
network = [['A','C', 2], ['A', 'D', 3]]
基于以下评论和回答的解决方案:edge = cfn.get((genes[i], genes[j]),0)
您在cfn
中的键是tuple
类型,因为键需要是可哈希类型
哈希类型是immutable
数据类型,例如:
- 字符串
- 元组
- frozenset
,因为它们不能被改变或突变。否则不能访问存储在该键下的值。
在这里你只需要把[]
改成()
:
def create_networks(genes, cfn):
network = list()
for i in range(0, len(genes)):
for j in range(1, len(genes)):
# Use () to create a tuple
edge = cfn.get((genes[i], genes[j]),0)
if edge > 0:
network.append([genes[i], genes[j], edge])
return network
这样你就不会得到错误而得到你期望的
结果>>> create_networks(genes, cfn)
[['A', 'C', 2], ['A', 'D', 3]]
你可以这样做:https://onecompiler.com/python2/3yp8xepzp
cfn = {'AB': 1, 'AC': 2 , 'AD': 3}
genes = ['A', 'C', 'D', 'E']
def create_networks(genes, cfn):
network = []
for i in range(0, len(genes)):
for j in range(1, len(genes)):
keyy = genes[i]+''+genes[j]
if keyy in cfn.keys():
edge2 = cfn[genes[i]+''+genes[j]]
if edge2 > 0:
network.append([genes[i], genes[j], edge2])
return network
print(create_networks(genes,cfn))