Python/2.7 information

파이썬다운(?) 코드.

qkqhxla1 2015. 4. 22. 14:36

여태까지 파이썬으로 이것저것 짜 보면서 왠만한건 다 만들수 있었고, 어느정도 익숙해졌다고 생각했는데

여태 파이썬을 제대로 못쓴것같다. c에 익숙하다가 파이썬으로 넘어와서 그런지 파이썬다운(?) 코드를

잘 못 짜는것 같다.(사실 c는 보안과는 다른 이유로 지금도 자주 쓰고있긴 하다.) 네이버에서 자료를 찾다가 한 질답을 보았는데 코드를 보고 신선한 충격을 받았다.

(역시 고수의 코드를 살피기만 해도 도움이 된다.)


http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=104&docId=223407592&qb=7YyM7J207I2s&enc=utf8&section=kin&rank=4&search_sort=3&spq=1


별거 아닌데 나같은경우 zip이나 dict같은건 그냥 개념만 알고 있어서 이러한 코드를 짤때 저런 방식으로 써서 효율적으로 짤수 있다는걸 깨달았다. 아래는 내가 요약한 코드이다.

# -*- encoding: cp949 -*-
f = """20150001,홍길동,80,85,70
20150002,김길동,80,70,70
20150003,이길동,70,80,85
20150004,박길동,75,80,90
20150005,최길동,85,70,85
20150006,구길동,80,80,70
20150007,강길동,70,70,85
20150008,조길동,75,80,85
20150009,유길동,90,90,95
20150010,진길동,75,80,80"""
keys = ['id', 'name', 'ko', 'ma', 'en']
record = []
for line in f.split('\n'):
    print zip(keys,line.split(','))
    print dict(zip(keys,line.split(','))),'\n'
    record.append(dict(zip(keys,line.split(','))))
for d in record:
    d['sum'] = int(d['ko']) + int(d['ma']) + int(d['en'])
    d['avg'] = d['sum'] / 3 
sorted_by_sum = sorted(record, key=lambda x: x['sum'])
sorted_by_avg = sorted(record, key=lambda x: x['avg'], reverse=True)

for i in sorted_by_sum:
    print i

만약 내가 위와 같은 코드를 짠다고 생각했으면 각 줄마다 ,로 나눈 후 [2:]범위의 값을들 더해서 합과 평균을 계산해서~ 하는 식으로 조금은 c식으로 짰을것 같다. 일단 나중에라도 참고를 위해 코드를 올려두고,

또다른 신선한 코드가 있으면 올려야지.


지식인을 뒤져본결과 하나 더 찾았다.

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10402&docId=223321062&qb=7YyM7J207I2s&enc=utf8&section=kin&rank=15&search_sort=3&spq=1


인데 알아볼수 있도록 변경.

# -*- encoding: cp949 -*-
def choice(a, b):
    if any([isinstance(i, str) for i in a]):
        return "문자열이 있습니다."
    if b >= len(a):
        return 0
    return [x ** b for x in a[:b]]
print choice(['a',2,3,4],3)
print choice([1,2,3,4,5],8)
print choice([1,2,3,4],2),'\n\n'

여기서는 any라는 연산자와 isinstance에 대해서 배웠다. 아마도 작성자는 인자로 리스트 a와 정수 b를 입력받아서 리스트 a내부에 문자열이 있으면 문자열이 있다고 반환, b가 a의 길이보다 크면 0 반환, b가 a의 길이보다 작으면 b만큼 제곱한 값을 원한것 같다.

isinstance()는 타입검사를 해준다. print isinstance(1,str) #false를 반환.

any라는 연산자도 여기서 처음 봤는데 http://saelly.tistory.com/568 이런 기능을 가진 연산자라고 한다.


교훈 : 고수들의 코드를 찾아보고 살펴보자, 파이썬의 기초적인 연산자나 함수를 잘 활용하자.


연습. 3 6 9 게임이다. 3 6 9 가 나오면 짝을 출력하자. 아래의 채워넣어야 할 부분을 채워넣어보자.

한줄로 만들어보자. 답은 아래에.

# -*- encoding: cp949 -*-
for c in [str(x) for x in range(1,100)]:
     #여기에 코드 작성.
     if count:
          print c,'짝'
     else:
          print c











답 : count = True if any((i in ['3','6','9']) for i in c) else False


추가 예정.