2014-09-16 3 views
0

안녕하세요 저는 파이썬에서 초보자입니다. 나는 "TEST.TXT"파일의 여러 줄을 읽고 동시에 값을 분리하여 사전에 저장하십시오.

1 2 5 
2 6 7 

as so on ..... 

로 파일을 다음 한 하나의 회선에 액세스 할 수 [x.split(' ') for x in edges.readline().rstrip().split(' ')]으로 나는 값을 읽고 난 다음 코드 있지만 작동하지 때우기 사전 에 저장할 파일의 또한 int() 타입 변환을 적용 할 수없는 목록을 반환합니다. 루프에서 여러 줄을 액세스 할 수 있지만이 작업을 수행 할 파이썬 방법을 알고 싶습니다.

connection = {(int(source),int(dest)):int(weight) for source,dest,weight in [x.split(' ') for x in edges.readline().rstrip().split(' ')]} 

올바른 종류의 파일을 읽고 사전에 저장하는 것이 좋습니다. 감사합니다. .

답변

1

여기에 조금 긴 경우, 꽤 깨끗 사전인가 이해의 : 발전기 표현의 사용 대신 목록 compherension의 파일에서 라인을 반복

with open("test.txt") as f: 
    connection = {(a, b) : c for a,b,c in (map(int, line.split()) for line in f)} 

주 - [map(int, line.split()) for line in f](map(int, line.split()) for line in f). 따라서 파일 내용이 모두 메모리에 저장되는 것을 피할 수 있습니다. 파일 크기가 클 경우 중요 할 수 있습니다.

mapline.split()에 의해 반환 된 모든 문자열을 정수로 변환하는 데 사용됩니다. 나는 map을 사용하는 것이 상응하는 목록 이해보다 좋다고 생각한다 : [int(x) for x in line.split()].

여기 개별 부분으로 나누어 같은 논리입니다 :

def f_it(f): 
    for line in f: 
     yield map(int, line.split()) 

connection = {} 
with open("test.txt") as f: 
    for a,b,c in f_it(f): 
     connection[(a,b)] = c 
:

connection = {} 
with open("test.txt") as f: 
    for line in f: 
     a,b,c = map(int, line.split()) 
     connection[(a,b)] = c 

가 DICT 이해와 진정한 동등하기 때문에, 우리는 파일 반복을 위해 발전기 기능을 작성해야합니다 것

관련 문제