티스토리 뷰

기존의 리스트 객체를 이용해 조합, 필터링등의 추가적인 연산을 통해 새로운 리스트 객체를 생성하는 경우, 리스트 내장은 매우 효율적이다.


간단한 예제를 통하여 살펴보자.

1
2
3
4
import random
random.seed(1)
= [random.randrange(0,20for i in range(10)] # list comprehension
print(b)
cs

위 예제를 실행하여 보자. 임의의 값이 10개가 출력되면 정상적으로 출력된 것이다.
0부터 20까지의 값을 i 라는 리스트에 10개 추가해서 생성된 리스트 객체를 반환값으로 내놓는다고 생각하면 쉽다.

1
print([i for i in b if i%== 1])
cs
다음과 같은 방법으로도 사용해 볼 수 있다. b의 i번째 방의 값인 i가 2로 나누어 떨어지지 않는다면, 즉 홀수인 것만 출력한다.

여기서 문제를 한번 풀어보자.

크롬에 구글 입사문제 라고 검색해본다.

해당 페이지로 들어가면 나오는 문제를 풀어보자.



간단한 반복문과 기본함수를 사용하여 다음과 같이 풀어 볼 수 있다.
1
2
3
result = 0
for i in range(110000):
    result += str(i).count('8')
cs

str 함수를 이용하여 정수 i를 문자열로 바꿔주고, 문자열의 멤버함수인 count를 이용하여 해당 숫자에 8이 몇개 들어있는지를 구해서 최종적으로 result에 누적해준다. 결과를 출력해보면 답은 4000이다. 그런데 우리가 방금 배운 리스트 내장을 사용하지 않아서 웬지 섭섭한 기분이 든다.

리스트 내장을 이용하면 다음과 같이 풀어볼 수 있다.

1
print([i for i in range(10000if (i % 10 == or i / 10 == or i / 100 == or i / 1000 == 8)])
cs

역시 답은 4000이다.

1
print(str(list(range(10000))).count('8'))
cs
이런식으로도 풀어볼 수 있다.

다음으로 내장 리스트를 조금 더 알아보자.

1
2
3
4
5
c1 = [random.randrange(0,100for i in range(10)]
c2 = [random.randrange(0,100for i in range(10)]
c3 = [random.randrange(0,100for i in range(10)]
 
= [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 % == 1for i in d])
cs

위에서 만들어 놓은 2차원 배열을 그대로 2차원의 형태로 출력하려면 위와 같은 코드를 사용하면 되겠다.

리스트 내장은 for문 안에 들어있는 변수가 제각각이라 이해하기가 다소 어려웠지만 잘 잡아놓으면 이후에도 사용성이 많을듯 하다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함