将两个列表映射到倒置字典中

时间:2012-05-14 20:40:54

标签: python dictionary

我有一系列基因,我想与一系列属性和颜色联系起来:

gene_A_color = red
gene_B_color = blue

gene_A_property = ['a','b','c']
gene_B_property = ['d','e','f']

为了绘图,我想创建一个字典,我可以使用属性值作为获取颜色或基因的键,如下所示:

#lookup dictionary
{'a': ['red', 'gene_A']
 'b': ['red', 'gene_A']
 'c': ['red', 'gene_A']
 'd': ['blue' 'gene_B']
 'e': ['blue' 'gene_B']
 'f': ['blue' 'gene_B']}
lookup[a][0] = red
lookup[a][1] = gene_A

我是这样开始的,但只有在我丢失基因名称时才能反转列表:

lookup_dict = defaultdict(list)
    lookup_dict['red'] =  ['a','b','c']
    lookup_dict['blue'] =  ['d','e','f']
inverted    = defaultdict(list)
for k, v in lookup_dict.items():
    inverted[v].append( k )

#inverted
{'a': 'red'
 'b': 'red'
 'c': 'red'
 'd': 'blue'
 'e': 'blue'
 'f': 'blue' }

建议?

2 个答案:

答案 0 :(得分:6)

你已经拥有了所需的一切,基因与属性的联系。其他所有东西都是有效的。

为什么不使用一个类代表基因?

class Gene(object):
    def __init__(self, color, properties):
        self.color = color
        self.properties = properties

geneA = Gene('red', ['a', 'b', 'c'])
geneB = Gene('blue', ['d', 'e', 'f'])
genes = [geneA, geneB]

inverted = {}
for gene in genes:
    for prop in gene.properties:
        inverted[prop] = gene.color

答案 1 :(得分:1)

如果您只想要几个简单的语句来执行此操作:

>>> gene_A_property = ['a','b','c']
>>> gene_B_property = ['d','e','f']
>>> ld={k:['red','gene_A'] for k in gene_A_property}
>>> ld.update({k:['blue','gene_B'] for k in gene_B_property})
>>> ld
{ 'a': ['red', 'gene_A'], 
  'c': ['red', 'gene_A'], 
  'b': ['red', 'gene_A'], 
  'e': ['blue', 'gene_B'], 
  'd': ['blue', 'gene_B'], 
  'f': ['blue', 'gene_B']
}