2012-08-23 3 views
1

Так что я файл с несколько строкой, которые выглядят как этот (файл пространство разделителя):посмотреть словарь в Python

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

Как сделать словарь искать идентификатор во втором столбце и сохранить номер (между словами) на четвертой колонке.

Я попробовал это, но это дает мне индекс затраченных диапазона

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'] 

ответ

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] 
+0

спасибо .. если я сделаю это в методе, просто добавлю def method_lookup (id) и добавлю возврат перед поиском? –

+0

Да, добавьте 'return lookup [id]' после последней строки, вне цикла for, конечно. (Хотя есть более эффективный способ сделать это, если вы просто хотите один идентификатор: искать правильную строку и обрабатывать только эту строку. Но для небольших файлов создание dict намного проще, поэтому вам, вероятно, следует придерживаться этого!) – BrtH

+0

@BrtH каким другим способом вы предполагаете, что у меня есть большой файл –

1

Если идентификатор и номер всегда во втором и четвертом столбце, и это всегда пространство разграничены вам не нужно использовать регулярные expresion. Вы можете разделить на пространствах вместо:

lookup = defaultdict(list) 
with open ('humsavar.txt', 'r') as humsavarTxt: 
    for line in humsavarTxt: 
     lookup[line.split(' ')[1]].append(line.split(' ')[3]) 
+0

ИТ не работает, когда я пытаюсь напечатать поиск [ ''] P04217 –

+0

'line.split (» «) 'превратит' '[пробел] [пробел] b" 'в' ['a', '', 'b'] '. Просто используйте 'line.split()'. – DSM

+0

@DSM спасибо .. вы знаете, почему это только дает 1 результат, так как id P04217 имеет две строки и он должен возвращать 2 результата –

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) 
+0

спасибо, не могли бы вы рассказать мне, что означает (\ d +)? –

+0

Это регулярное выражение для 1 или более цифр –

Смежные вопросы