2017-07-26 39 views
0

我想從製表符分隔文件(無標題)創建兩個python3字典。該文件有2列,我想命名爲group_id和gene_id。一個組可能有多個基因,一個基因可能屬於多個組。我會用一個簡單的例子來展示我想要的。從不是1:1的製表符分隔文件創建Python字典

group_id gene_id 

A  a 
A  b 
A  c 
A  d 
B  a 
B  c 
B  e 

我想有2點字典:

dict1 = {'A':(a,b,c,d),'B':(a,c,e)} 

dict2 = {'a':(A,B), 'b':(A), 'c':(A,B), 'd':(A), 'e':(B)} 

我想存儲在元組值的速度,因爲我的文件是2.5 GB的,我會最終得到我以後需要處理的大字典。

我知道有很多像這樣的問題,但我無法從那些處理具有鍵值對的文件中找到答案。

謝謝!

+2

肯定。你有沒有試圖實現這一點呢?看到你的代碼會很高興,看看你有多遠以及你有什麼困難。 – idjaw

+0

熊貓是一個開始的好地方。 –

+0

值可以是列表而不是元組嗎? – wwii

回答

1

collections模塊具有defaultdict方法,它返回一個新的字典類物體。只需將值附加到每個鍵上,您就完成了很多工作。

from collections import defaultdict 
dict1 = defaultdict(list) 
dict2 = defaultdict(list) 

with open("C:/path/example.txt") as f: 
    header = f.next() 
    for line in f: 
     if line.strip(): 
      a,b = line.strip().split() 
      dict1[a].append(b) 
      dict2[b].append(a) 

print dict1

回報

defaultdict(<type 'list'>, {'A': ['a', 'b', 'c', 'd'], 'B': ['a', 'c', 'e']}) 

dict2

defaultdict(<type 'list'>, {'a': ['A', 'B'], 'c': ['A', 'B'], 'b': ['A'], 'e': ['B'], 'd': ['A']}) 
+0

它的工作。謝謝。 – Ani

+0

你想接受我的答案@Ani? –

1

我認爲這裏的代碼有其自身的意義,但基本上,因爲你正在使用字符串,你可以只有兩個單獨的字典,然後解析每一行。如果你有一個新的價值,你必須創建一個新的條目,你用if語句來做。有一點,你應該使用列表,因爲元組是不可改變的,不能更改在創建後:

data = """group_id gene_id 
    A  a 
    A  b 
    A  c 
    A  d 
    B  a 
    B  c 
    B  e""" 

lines = data.splitlines() 
group_dict = {} 
gene_dict = {} 

for line in lines[1:]: 
    group, gene = line.split() 
    if group not in group_dict.keys(): 
     group_dict[group] = list() 
    group_dict[group].append(gene) 

    if gene not in gene_dict.keys(): 
     gene_dict[gene] = list() 
    gene_dict[gene].append(group) 

from pprint import pprint 
pprint(group_dict) 
pprint(gene_dict) 

打印:

{'A': ['a', 'b', 'c', 'd'], 'B': ['a', 'c', 'e']} 
{'a': ['A', 'B'], 'b': ['A'], 'c': ['A', 'B'], 'd': ['A'], 'e': ['B']}