2015-04-07 2 views
1

У меня есть файл, из которого мне нужно удалить дублированные пары (выделены полужирным шрифтом).словарь python удалять повторяющиеся пары значений ключей

Входной файл:

AT1G01010 = 0005634 
**AT1G01010 = 0006355** 
AT1G01010 = 0003677 
AT1G01010 = 0007275 
**AT1G01010 = 0006355 
AT1G01010 = 0006355** 
AT1G01010 = 0006888 
**AT1G01020 = 0016125** 
AT1G01020 = 0016020 
**AT1G01020 = 0005739** 
**AT1G01020 = 0016125** 
AT1G01020 = 0003674 
AT1G01020 = 0005783 
**AT1G01020 = 0005739** 
**AT1G01020 = 0006665 
AT1G01020 = 0006665** 

Ожидаемый результат:

AT1G01010 = 0005634 
AT1G01010 = 0006355 
AT1G01010 = 0003677 
AT1G01010 = 0007275 
AT1G01010 = 0006888 
AT1G01020 = 0016125 
AT1G01020 = 0016020 
AT1G01020 = 0005739 
AT1G01020 = 0003674 
AT1G01020 = 0005783 
AT1G01020 = 0006665 

Так, чтобы удалить дубликаты, я первым сделал словарь. После создания словаря я пробовал эту кодировку:

import sys 

ara_go_file = open (sys.argv[1]).readlines() 

ara_id_list = [] 
ara_go_list = [] 


for lines in ara_go_file: 
    split_lines = lines.split(' ') 
    ara_id  = split_lines[0] 
    ara_id_list.append(ara_id) 

    go_id_split = split_lines[-1] 
    go_id  = go_id_split.split('\n')[0] 
    ara_go_list.append(go_id) 

ara_id_go_dic = dict (zip(ara_id_list, ara_go_list)) ##ara_id_go_dic (this is the name of the dict I have created) 

new_dict = {} # made a new dict to copy the data into this n remove the duplicate pairs 

for k in ara_id_go_dic.items(): 
    if k[0] in new_dict: 
     if k[1] not in new_dict[k[0]]: 
      new_dict[k[0]].append(k[1]) 
     else: 
      new_dict[k[0]]=[k[1]] 

print new_dict 

Я не знаю, где именно я делаю ошибку.

Пожалуйста, дайте мне знать мою ошибку, иначе, если есть другой способ удалить повторяющиеся пары.

+0

Какой выход вы получаете? –

+0

Я получаю пустой dict. – rhkss

+0

Как создается словарь 'ara_id_go_dic'? Можете ли вы просто распечатать этот словарь? –

ответ

2

Вы можете использовать set удалить дублированные элементы:

>>> s="""AT1G01010 = 0006355 
... AT1G01010 = 0003677 
... AT1G01010 = 0007275 
... AT1G01010 = 0006355 
... AT1G01010 = 0006355 
... AT1G01010 = 0006888 
... AT1G01020 = 0016125 
... AT1G01020 = 0016020 
... AT1G01020 = 0005739 
... AT1G01020 = 0016125 
... AT1G01020 = 0003674 
... AT1G01020 = 0005783 
... AT1G01020 = 0005739 
... AT1G01020 = 0006665 
... AT1G01020 = 0006665""" 
>>> for j in set([i for i in s.split('\n')]): 
...  print j 
... 
AT1G01010 = 0005634 
AT1G01020 = 0016020 
AT1G01010 = 0007275 
AT1G01010 = 0006355 
AT1G01020 = 0006665 
AT1G01010 = 0003677 
AT1G01020 = 0005783 
AT1G01020 = 0016125 
AT1G01020 = 0005739 
AT1G01020 = 0003674 
AT1G01010 = 0006888 
+0

Собственно, строка уже неизменяема, вы должны сделать преобразование в пару только в том случае, если существует риск различного форматирования; в противном случае 'set (ara_go_file)' достаточно. –

+0

@FrancisColas результат 'split' - это' list', а списки ** mutable **, но да, это избыточная работа;) – Kasramvd

+0

Вам нужно «разбить» вход в «список», потому что вы поместите его в одну строку, но в случае с OP это файл, так что самоналоженное ограничение. –

0

Использование CSV модуль и установить:

  1. чтения входного файла с помощью CSV модулей и создавать множество кортежей. set не сохраняет повторяющееся значение.
  2. Writer output в новом файле.

вход:

же упоминание о котором идет речь.

Демо:

import csv 
p = "dp-input.txt" 
result = set() 
with open(p , "rb") as fp: 
    root = csv.reader(fp, delimiter='=') 
    for row in root: 
     result.add((row[0], row[1])) 

p1 = "dp-output.txt" 
with open(p1 , "wb") as fp: 
    root = csv.writer(fp, delimiter='=') 
    root.writerows(result) 

Выход:

AT1G01010 = 0006888 
AT1G01020 = 0016020 
AT1G01020 = 0005739 
AT1G01010 = 0007275 
AT1G01020 = 0003674 
AT1G01020 = 0016125 
AT1G01020 = 0005783 
AT1G01020 = 0006665 
AT1G01010 = 0003677 
AT1G01010 = 0005634 
AT1G01010 = 0006355 
Смежные вопросы