1

だから私はこのように見える複数の行を持つファイルを持っています(スペース区切り文字ファイル):

A1BG      P04217     VAR_018369  p.His52Arg     Polymorphism  rs893184    -
A1BG      P04217     VAR_018370  p.His395Arg    Polymorphism  rs2241788   -
AAAS      Q9NRG9     VAR_012804  p.Gln15Lys     Disease       -           Achalasia

2番目の列でidを検索し、4番目の列に番号(単語間)を格納する辞書を作成するにはどうすればよいですか。

私はこれを試しましたが、範囲外のインデックスが得られます

lookup = defaultdict(list)
with open ('humsavar.txt', 'r') as humsavarTxt:
    for line in csv.reader(humsavarTxt):
        code = re.match('[a-z](\d+)[a-z]', line[1], re.I)
        if code: 
            lookup[line[-2]].append(code.group(1))

print lookup['P04217']
4

3 に答える 3

3

元のコードの変形は次のとおりです。

import csv, re
from collections import defaultdict

lookup = defaultdict(list)
with open('humsavar.txt', 'rb') as humsavarTxt:
    reader = csv.reader(humsavarTxt, delimiter=" ", skipinitialspace=True)
    for line in reader:
        code = re.search(r'(\d+)', line[3])
        lookup[line[1]].append(int(code.group(1)))

を生成します

>>> lookup
defaultdict(<type 'list'>, {'P04217': [52, 395], 'Q9NRG9': [15]})
>>> lookup['P04217']
[52, 395]
于 2012-08-23T21:17:25.627 に答える
1

IDと数値が常に2列目と4列目にあり、常にスペースで区切られている場合は、通常の式を使用する必要はありません。代わりに、スペースで分割できます。

lookup = defaultdict(list)
with open ('humsavar.txt', 'r') as humsavarTxt:
    for line in humsavarTxt:
         lookup[line.split(' ')[1]].append(line.split(' ')[3])
于 2012-08-23T20:33:39.780 に答える
0

純粋な辞書が必要な場合、これは機能します。

d={}
with open(your_file,'rb') as f:
    for line in f:
        l=line.split()
        num=int(re.search(r'(\d+)',l[3]).group(1))
        d.setdefault(l[1],[]).append(num)

プリント:

{'P04217': [52, 395], 'Q9NRG9': [15]}

非正規表現ソリューションの場合、これを行うこともできます。

d={}
with open(your_file,'rb') as f:
    for line in f:
        els=line.split()
        num=int(''.join(c for c in els[3] if c.isdigit()))
        d.setdefault(els[1],[]).append(num)
于 2012-08-23T23:48:48.053 に答える