2016-09-02 3 views
1

CSV 파일에서 중복 값 열 A를 정렬하려고하지만 Python에서 예상 결과를 얻지 못했습니다.중복 값 열을 CSV 파일에서 정렬

입력 파일 (.csv)로

열 이름 : 나는 PDB ID와 리간드 ID와 함께 우니 뽀 르트도 Acc 열의 중복 값과 싱글을 정렬 할

Uniprot Acc, PDB ID, Ligand ID, Structure Title, Uniprot Recommended Name, Gene Name, Macromolecular Name 

.

Input file: 
Uni port Acc PDB ID Ligand ID 
* P0AET8 1AHI NAI 
* P04036 1ARZ NAI 
* Q59771 1C1D NAI 
* P0C0F4 1DLJ NAI 
* Q9QYY9 1E3E NAI 
* Q9QYY9 1E3I NAI 
* Q14376 1EK6 NAI 
* Q16836 1F17 NAI 
* P0AET8 1FMC NAI 
* Q46220 1GIQ NAI 
* P97852 1GZ6 NAI 
* P07195 1I0Z NAI 
* P00338 1I10 NAI 
* P11986 1JKI NAI 
* P10760 1KY5 NAI 
* Q2RSB2 1L7E NAI 
* Q27743 1LDG NAI 
* O32080 1LSU NAI 
* P00334 1MG5 NAI 
* P26392 1N2S NAI 
* P9WGT1 1NFQ NAI 
* P0ABH7 1NXG NAI 
* P05091 1NZW NAI 
* P05091 1NZZ NAI 
* P27443 1O0S NAI 
* P0A6D5 1O9B NAI 
* P20974 1OG4 NAI 
* P11986 1P1J NAI 

Expected Result: 
Uni port Acc PDB ID Ligand ID 
* P0AET8 1AHI NAI 
* P0AET8 1FMC NAI 
* P04036 1ARZ NAI 
* Q59771 1C1D NAI 
* P0C0F4 1DLJ NAI 
* Q9QYY9 1E3E NAI 
* Q9QYY9 1E3I NAI 
    . 
    . 
    . 





I want to sort how many uniport acc id same with pdb id along with single id, No need to remove any id. 

코드 :

import csv 
import re 
import sys 
import os 

f1 = csv.reader(open('one.csv', 'rb')) 

writer = csv.writer(open("Output_file_1.csv", "wb")) 
def has_duplicates(f1):  
    for i in range(0, len(f1)): 
     for x in range(i + 1, len(f1)): 
      if f1[i] == f1[x]: 
       var = f1[i]      
       writer.writerow(var) 
+0

정확하게 정렬하고/무엇인가를 정렬하려고합니까?! 지금까지 볼 수 있듯이 출력 파일에 중복 된 행만 작성합니다. 그러나 행이'k '번 반복되면, 출력 파일에서'k * (k-1)/2' 번 찾을 것입니다. 이거 목적이 있니? – Antoine

+0

** 중복 된 행을 ** 다른 파일로 분리하려고 시도하고 있다는 것을 의미합니까? –

+0

다른 세부 정보와 함께 열 A에 중복 값을 정렬하려고합니다. – krish

답변

1

당신은 먼저 당신이 쉽게 정렬 된 순서로 중복 값을 찾을 수있는 목록에있는 모든 값을 저장할 수 있습니다. 내 아래 코드를 참조하십시오. 같은

import csv 
    import re 
    import sys 
    import os 

    f1 = csv.reader(open('one.csv', 'rb')) 

    writer = csv.writer(open("Output_file_1.csv", "wb")) 

    def has_duplicates(f1): 
     list = [] 
     for i in range(0, len(f1)): 
      list.append(f1[i]) 
     for var in set([x for x in list if list.count(x) > 1]): 
      writer.writerow(var) # print only duplicate values in a sorted list 

새로운 편집을 홍보하여 ​​예상 된 결과

이에 대한 sorted을 사용할 수 있지만이 예상되는 결과 만 약간의 차이가 제공됩니다. 예상 된 결과를 얻으려면 다음 코드를 사용할 수 있습니다.

def sort_duplicates(f1): 
     for i in range(0, len(f1)): 
      f1.insert(f1.index(f1[i])+1, f1[i]) 
      f1.pop(i+1) 
for var in f1: 
    writer.writerow(var) 

목록으로 테스트했습니다. 이것은 결과 스크린 샷입니다.

>>> a=['P0AET8', 'Q59771', 'P0C0F4','DFC4H', 'P0AET8','Q59771','ACG5D'] 
>>> print sorted(a) 
['ACG5D', 'DFC4H', 'P0AET8', 'P0AET8', 'P0C0F4', 'Q59771', 'Q59771'] 

그리고 위의 코드를 사용하면 결과입니다.

>>> a=['P0AET8', 'Q59771', 'P0C0F4','DFC4H', 'P0AET8','Q59771','ACG5D'] 
>>> for i in range(0,len(a)): 
...    a.insert(a.index(a[i])+1, a[i]) 
...    a.pop(i+1) 

>>> print a 
['P0AET8', 'P0AET8', 'Q59771', 'Q59771', 'P0C0F4', 'DFC4H', 'ACG5D'] 
+0

솔루션에 설명을 추가하는 것이 좋습니다. – zx8754

+2

여전히 2 차 복잡성을 가지며 출력 파일에서 선이 임의의 순서로 끝날 수 있습니다. 세트에 행을 추가하는 것이 더 좋으며 행이 이미 세트에 있으면 출력 파일에 작성하십시오. –

+0

안녕하세요 @SumanKalyan, 위 코드를 시도했지만 결과가 나타납니다. 출력 파일이 비어 있습니다 ... – krish

관련 문제