파이썬 사전 생성 중 이상한 점이 몇 가지 있습니다..


안녕하세요. 파이썬 입문자입니다.

csv파일 안의 데이터들이 첫줄에 Rank, Major_code, 이렇게 항목들로 있고 그 다음줄부터 데이터들이 있는데요

첫줄 데이터와 밑줄 데이터를 엮어서 사전으로 만드는 걸 하고 있습니다.

그런데 사전 생성은 문제 없이 잘 됩니다만.. 데이터가 8개이면 8개가 전부 같은 것으로 출력됩니다. 그리고 항목이랑 데이터랑 엮여진 것이 Rank, Major_code, 이런 순서대로 나와야하는데 순서도 뒤죽박죽입니다..그런데 유심히 순서를 보니 항목 알파벳 정렬순대로 된 것 같습니다.

일단 코드랑 실행 했을때를 보여드리겠습니다.

import os

def read_major_file(filenames):
    os.chdir('../Data/Day4-Dictionaries/College-Majors/')
    text = open(filenames,'r')
    linetext = text.readlines()
    d = []
    for line in linetext:
        f = line.rstrip('\n').split(',')
        d.append(f)
    data_dict = {}
    final = []
    for i in range(1,len(d)): // 첫 인덱스를 1로 놓은 이유는 두번째 줄 부터가 데이터이기 때문입니다.
        for r in range(len(d)):
            data_dict[d[0][r]]=d[i][r]
        final.append(data_dict)
    return final
In [168]: read_major_file('recent_Arts.csv')
Out[168]: 
[{'Major': 'DRAMA AND THEATER ARTS',
  'Major_category': 'Arts',
  'Major_code': '6001',
  'Men': '7022',
  'Rank': '167',
  'Sample_size': '357',
  'ShareWomen': '0.629504564',
  'Total': '43249',
  'Women': '11931'},
 {'Major': 'DRAMA AND THEATER ARTS',
  'Major_category': 'Arts',
  'Major_code': '6001',
  'Men': '7022',
  'Rank': '167',
  'Sample_size': '357',
  'ShareWomen': '0.629504564',
  'Total': '43249',
  'Women': '11931'},
 {'Major': 'DRAMA AND THEATER ARTS',
  'Major_category': 'Arts',
  'Major_code': '6001',
  'Men': '7022',
  'Rank': '167',
  'Sample_size': '357',
  'ShareWomen': '0.629504564',
  'Total': '43249',
  'Women': '11931'},

for문 한번 돌리고 break시켜서 봤을 때는 첫번째 값이 제대로 나왔었는데 전체를 돌리니 사전 값이 계속 초기화가 되는 것 같습니다. 지금 저것들은 맨 마지막 데이터입니다.

그리고 항목들도 Rank, Major_code, Major, Total 이런 순서여야 하는데 뭔가 정렬이 된듯하게 섞여버렸습니다. 배열 지정에는 문제가 없습니다. 따로따로 출력시켜봤을 때 제대로 나왔었습니다.

질문을 요약하자면

  1. for문을 다 돌렸을 때 결과가 지금 n번째 데이터로만 나와있는데, 1~n번째로 나오도록 할 수 있는 방법
  2. 항목 순서 정렬 안되게 출력하는 법
  3. 데이터에 숫자에 ' ' 가 붙어있는데 이게 아마 형태가 str이어서 그런거같은데, 숫자들만 int로 바꿀 수 있나요?

도와주세요..!!!

  • 2016년 11월 08일에 작성됨
    프로그래머가 되고싶은 1人

조회수 73


1 답변


좋아요
0
싫어요
채택취소하기

1 for문을 다 돌렸을 때, 코드로 봐서는 final에 1~n번째가 다 들어갈 것 같습니다.

2 사전(dictionary)에 들어간 값은 Key 기준으로 정렬이 되지 않습니다. 출력이 되기를 원하는 Key를 이용해서 순서대로 출력하시는 방법밖에 없습니다. 순서를 지정하고 싶으시다면 출력이 되기를 원하는 키의 순서대로 리스트를 만들고 해당 리스트를 이용해서 값을 불러와서 출력하세요.예를 들어 다음과 같이 print_order를 이용하시면 됩니다.

dict = {'Major': 'DRAMA AND THEATER ARTS',
  'Major_category': 'Arts',
  'Major_code': '6001',
  'Men': '7022',
  'Rank': '167',
  'Sample_size': '357',
  'ShareWomen': '0.629504564',
  'Total': '43249',
  'Women': '11931'}

print_order = ['Major','Major_category','Major_code','Men','Rank','Sample_size','ShareWomen','Total','Women']

for i in range(len(print_order)):
    print(print_order[i]+": "+dict[print_order[i]])

3 .숫자에 소수가 포함되기 때문에 data_dict[d[0][r]]=d[i][r] 이 부분에서 d[i][r]의 값을 검사해서 숫자만 포함되어 있으면 int(d[i][r])을 이용하고 숫자와 .이 포함되어 있으면 float(d[i][r])을 이용하면 되겠습니다.

다른 방법으로 이렇게 정수인지 검사할 수도 있습니다. 정수가 아니면 float인지 검사하고 아니면 그냥 넣으면 되겠네요.

def intTryParse(value):
    try:
        return int(value), True
    except ValueError:
        return value, False
  • 2016년 11월 08일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close