목록

2014-10-06 3 views
1

나는 모든 행은 인덱스 (A, B) 다음 내가 원하는 것을목록

a\t12|123|08340|4985 
b\t3856|12|276 

에 관련된 숫자의 목록이다가 있습니다 경우, 같은 라인 파일이의 사전에 항목을 추가 행에서 같은 번호를 두 개 이상이있는 경우 첫 번째 항목의 값이 난 단지 출력 유전자의 고유 한을 원하고이 출력

12 a 
123 a 
8340 a 
4985 a 
3856 b 
276 b 

주에 도착.

글자를 키로 사용하고 숫자를 값으로 사용하여 사전에 숫자를 추가하려고 시도했습니다. 마지막으로, 해당 문자와 ​​함께 숫자의 set() 만 출력합니다.

uniqueval = set() 
d = defaultdict(list) 

for line in file: 
    fields = line.strip().split(\t) 
    Idx = fields[0] 
    Values = fields[1].split("|") 
    for Val in Values: 
     uniqueval.add(Val) 
     d[Idx] += Val 
     for u in uniqueval: 
      print u,"\t", [key for key in d.keys() if u in d.values()] 

스크립트를 실행하지만 사전 조사 때 발의는 모두 같은 문자로 분할됩니다 :이 글은 이후 값이 분할 된 이유를 이해가 안

{'a': ['1','2','1'....], 'b': ['3', '8',....]} 

for 루프는 각 Val을 새로운 값으로 가져 와서 dict에 추가 할 것이라고 생각했습니다. 이 문제를 이해하도록 도와 주시겠습니까?

감사합니다.

답변

2

당신은 Val하여 목록을 확장됩니다

d[Idx] += Val 

이 별도의 요소로 Val의 각 문자를 추가합니다. 대신

사용 append() :

d[Idx].append(Val) 
+0

감사합니다 - 작동하지만'Values'에 발을위한 문자열 목록 중 각 요소를 의미하기 때문에 내 경우는 각 문자를 추가하는 이유를 잘 모르겠어요 그래서 Val은 각 루프 안에 1 개의 문자열입니다 ... 내가 틀렸어? 게다가, 나는 방금 내가 필요로하는 사전을 만들지 않는다는 것을 발견했다. 어떻게 든 많은 가치들이 여러 번 추가되고 훨씬 더 긴 목록을 남기고 - 왜 그런지 모르겠다. – oaklander114

+0

'+ ='는'list.extend()'와 같은 일을합니다; 각 * 요소 *를 가져 와서 하나씩 추가하십시오. 문자열에서 요소는 개별 문자입니다. –

+0

리스트 대신'Idx'에 대해 고유 한 값만 수집하려면'd [Idx] .add (Val)'을 사용하십시오. –