2012-07-23 53 views
1

我有配对的条目列表的文件(密钥)是这样的:定义值列表的字典键使用外部文件

6416 2318 
84665 88 
90 2339 
2624 5371 
6118 6774 

而且我已经得到了与另一个文件值到这些按键:

266743 Q8IUM7 
64343 H7BXU6 
64343 Q9H6S1 
64343 C9JB40 
23301 Q8NDI1 
23301 A8K930 

正如你可以看到相同的密钥可以有多个值。我想要做的是创建一个字典,通过自动创建初始k,v对,然后为已经在字典中的每个条目附加更多值,如下所示:

程序找到"266743: 'Q8IUM7'",然后"64343: 'H7BXU6'"。当它发现"64343: 'Q9H6S1'"它这样做:"64343: ['H7BXU6', 'Q9H6S1']"

这是我到目前为止有:

# Create dictionary 
    data = {} 

    for line in inmap: 
     value = [] 
     k, v = [x.strip() for x in line.split('\t')] 
     data[k] = value.append(v) 
     if k in data.viewkeys() == True and v in data.viewvalues() == False: 
      data[k] = value.append(v) 

但如果声明似乎没有工作。或者在for循环中有value = []。有什么想法吗?

回答

3

这不是一个好主意。您应该从头开始使用列表,并在列表中扩展该列表,而不是在找到该键的多个值时从“字符串”更改为“字符串列表”。

对于这一点,你可以简单地使用

from collections import defaultdict 
data = defaultdict(list) 
for line in inmap: 
    k, v = (x.strip() for x in line.split('\t')) 
    data[k].append(v) 

这工作,因为list类型的defaultdict会自动对空列表作为它的价值共创的关键,当你试图引用一个不关键还存在。否则,它的行为就像一个普通的字典。

结果:

>>> data 
defaultdict(<type 'list'>, {'23301': ['Q8NDI1', 'A8K930'], 
'64343': ['H7BXU6', 'Q9H6S1', 'C9JB40'], '266743': ['Q8IUM7']}) 
+0

Wooah,就这么简单!猜猜我只是让自己变得很难。像魅力一样工作,非常感谢! – 2012-07-23 11:13:24

+0

是的,是不是很棒? – 2012-07-23 11:13:45