2015-12-18 5 views
0

У меня есть текстовый файл, состоящий из нескольких строк. Каждая строка имеет несколько значений строк и целых чисел. Пример текста заключается в следующем:Python: проверка совпадающих значений в текстовом файле

>|P1|Pa|,1,2,7,4 
>|P2|Pa|,7,9,0,3 
>|Pa|P1|,5,5,7,2 
>|Pa|P2|,2,3,8,4 
>|Pb|Pa|,8,4,3,1 

Значение между вертикальными линиями, такими как P1 и Па, является идентификатором для каждой строки. Я хочу написать код, который переписывает взаимные линии с одинаковыми идентификаторами и присваивает им одинаковый номер. Таким образом, первые и третьи строки должны иметь последнее значение 1. Выход программы должен быть следующим:

>|P1|Pa|,1,2,7,4,1 
>|P2|Pa|,7,9,0,3,2 
>|Pa|P1|,5,5,7,2,1 
>|Pa|P2|,2,3,8,4,2 
>|Pb|Pa|,8,4,3,1,3 

Чтобы решить эту проблему, я создал словарь, чтобы иметь идентификаторы в качестве ключей и назначаются номера в качестве значений. Однако я не мог правильно присвоить числа взаимным линиям. Следующий код:

import sys 

h=(sys.argv[1]) 
q_d={} 
count=0 
with open(h)as f: 
    for line in f: 
     if line.startswith('>'): 
     count=count+1 
     line=line.strip('\n') 
     ID=line.split('|') 
     q=ID[1] 
     s=ID[2] 
     q_d[str(q)]=count 
     if q_d.has_key(q): 
      print line+','+str(q_d[q]) 
     elif q_d.has_key(s): 
      print line+','+str(q_d[s]) 

А вот выход я получаю:

>|P1|Pa|,1,2,7,4,1 
>|P2|Pa|,7,9,0,3,2 
>|Pa|P1|,5,5,7,2,3 
>|Pa|P2|,2,3,8,4,4 

Как назначить одинаковое количество взаимных линий в словаре?

+0

Вместо использования 'elif' использовать' и' в одном '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Или, как предлагает qwr, сделайте ключ кортежем. –

ответ

0

Используйте комплект, который не зависит от заказа. Псевдо-код:

q_d = set() 
... 
if (q, s) in q_d: 
    ... 
else: 
    q_d.add((q, s)) 
Смежные вопросы