티스토리 뷰
기존의 리스트 객체를 이용해 조합, 필터링등의 추가적인 연산을 통해 새로운 리스트 객체를 생성하는 경우, 리스트 내장은 매우 효율적이다.
간단한 예제를 통하여 살펴보자.
1 2 3 4 | import random random.seed(1) b = [random.randrange(0,20) for i in range(10)] # list comprehension print(b) | cs |
위 예제를 실행하여 보자. 임의의 값이 10개가 출력되면 정상적으로 출력된 것이다.
0부터 20까지의 값을 i 라는 리스트에 10개 추가해서 생성된 리스트 객체를 반환값으로 내놓는다고 생각하면 쉽다.
1 | print([i for i in b if i%2 == 1]) | cs |
여기서 문제를 한번 풀어보자.
해당 페이지로 들어가면 나오는 문제를 풀어보자.
간단한 반복문과 기본함수를 사용하여 다음과 같이 풀어 볼 수 있다.
1 2 3 | result = 0 for i in range(1, 10000): result += str(i).count('8') | cs |
str 함수를 이용하여 정수 i를 문자열로 바꿔주고, 문자열의 멤버함수인 count를 이용하여 해당 숫자에 8이 몇개 들어있는지를 구해서 최종적으로 result에 누적해준다. 결과를 출력해보면 답은 4000이다. 그런데 우리가 방금 배운 리스트 내장을 사용하지 않아서 웬지 섭섭한 기분이 든다.
리스트 내장을 이용하면 다음과 같이 풀어볼 수 있다.
1 | print([i for i in range(10000) if (i % 10 == 8 or i / 10 == 8 or i / 100 == 8 or i / 1000 == 8)]) | cs |
역시 답은 4000이다.
1 | print(str(list(range(10000))).count('8')) | cs |
이런식으로도 풀어볼 수 있다.
다음으로 내장 리스트를 조금 더 알아보자.
1 2 3 4 5 | c1 = [random.randrange(0,100) for i in range(10)] c2 = [random.randrange(0,100) for i in range(10)] c3 = [random.randrange(0,100) for i in range(10)] d = [c1, c2, c3] | cs |
2차원 배열인 d을 1차원 배열처럼 한줄로 출력해보자.
두가지 방법을 예로 들어볼 수 있다.
1 2 | print(d[0]+d[1]+d[2]) print([j for i in d for j in i]) | cs |
첫번째 줄에 소개된 방법은 말그대로 2차원 배열을 한줄로 출력해주는데에 그친다.
하지만 그 다음 코드는 데이터를 가공할 수 있다는 점이 좋다. 요소 하나하나를 2배로 출력하기 위해 j*2라고 앞에 입력하거나 홀수짝수를 구분하기 위해 뒤에 if문을 붙이거나 할 수 있다.
1 2 | print([[j for j in i] for i in d]) print([[j for j in i if j % 2 == 1] for i in d]) | cs |
위에서 만들어 놓은 2차원 배열을 그대로 2차원의 형태로 출력하려면 위와 같은 코드를 사용하면 되겠다.
리스트 내장은 for문 안에 들어있는 변수가 제각각이라 이해하기가 다소 어려웠지만 잘 잡아놓으면 이후에도 사용성이 많을듯 하다.
'파이썬' 카테고리의 다른 글
파이썬 : [DJango] 모델 클래스 만들기. (0) | 2015.05.24 |
---|---|
파이썬 : DJango를 이용하여 파이썬으로 데이터베이스 서버를 가상환경에서 구동해보자 (2) | 2015.05.23 |
파이썬 : 람다 함수 (lambda function) (0) | 2015.05.20 |
파이썬의 포인터 (2) | 2015.05.19 |
파이썬 예제 : 튜플(Tuple)을 정렬(Sort)하는 여러가지 방법 (1) | 2015.05.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 데이터베이스
- 디렉터리
- 소켓
- MFC
- 정렬
- 클라이언트
- 파이썬예제
- socket
- 티라노 시그널
- 파일
- 프로세스
- 소켓 프로그래밍
- 라즈베리파이
- 액터
- Sort
- 안드로이드
- 스레드
- 쓰레드
- 리눅스
- 클래스
- 터미널
- 유즈케이스
- UML
- C
- C/C++
- C++
- 악보
- 티그널
- 자료구조
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함