728x90
반응형

List 배열 with generator(제너레이터)

1) List를 통해 여러 줄에 걸쳐 여러 값 나눠 받기

이게 어떤 의미이냐면, 1, 2, 3 이라는 3값을 입력받기 위해 앞 글에서 사용한 방법을 사용해서
1 2 3
입력해서 list에 넣는 것이 아니라
1
2
3
이렇게 입력해서 list에 넣는 방식이다.
이렇게 입력을 하는 방식이 한 줄로 입력 받는 것 보다 더 많은 활용을 할 수 있다.
예를 들어, 수 명의 생년 월일을 입력받고 저장하는 프로그램을 만든다고 할때,
1990 01 02 1991 02 05 1995 05 12....
이렇게 입력 받아 1차원 list를 사용하는 것 보다
1990 01 02
1991 02 05
1995 05 12
이렇게 입력 받아 2차원 list를 활용하는 것이 더 편하다.

2차원 list를 만드는 것은 크게 어렵지 않다.
list 안에 반복문을 활용하여 여러 리스트를 입력받으면 된다.
다만, 여기에 사용되는 문법을 제대로 알려고 하면, 쉽지는 않다.

728x90

2) 여러 줄에 걸쳐 단어(들)을 받을 때, [[word for word in input().split()] for y in range(num<-숫자 혹은 int 타입 변수)]

* for 문 간략 설명
  for 변수 조건 와 같은 형태로 쓰며, 변수가 조건에 부합하는 동안 명령을 반복한다.
for 문 링크
* range(숫자) 간략 설명
  숫자 범위에 포함하는 숫자 list를 만들어주는 함수이다. 리턴 값은 list가 아니므로 list로 출력을 하기위해서는 list(range(숫자)로 해야 한다.
for 문 링크
* in 리스트_변수_이름
  조건으로 사용되는 문법으로 리스트에 값이 있는지를 물어보는 것이다. 예를 들어 3 in [1, 3, 5] 인 경우 참이고, 3 in [2, 4, 6] 인 경우에는 거짓이다.
- 조건 링크 - 

2-1) generator(제너레이터) 이해

[[word for word in input().split()] for y in range(num)] 라는 구문에서 for가 사용되긴 하였지만, 이것은 generator 함수라는 것이다.
x=0
for x in range(3):
    x=x
이와 같이 일반 for문이라면, 반복문이 끝난 다음에 x는 마지막 반복 결과인 2이 들어가 있을 것이다.
만약 x for x in range(3) 라고 표현이 되어있다면, 이것은 일반 for문과 다르게, x가 가지는 값이 마지막 반복 결과인 2이 아니라, 0, 1, 2 모둔 결과 값을 가질 수 있다.(yield 때문인데, 그러려니 하자. 가질 수 있다!)

그래서 x for x in range(3)를 [ ]로 씌우거나 list( ) 함수를 적용하면 [0, 1, 2]와 같은 리스트가 만들어진다..

이해를 위해 [num+4 for num in range(3)]의 경우를 그림으로 표현해보면 아래와 같다.

이 문장이 수행되면 최종적으로 [4,5,6]이 나오게된다.

반응형

2-2) [[word for word in input().split()] 이해

word for word in input().split()를 제대로 보면
이 for문에서 word라는 변수는 input().split()으로 받아진 배열에서 값을 차례차례 가져온다.
input().split()으로 sam jack 이렇게 두 단어를 띄어쓰기를 기준으로 받았다면
word는 처음 반복일때, sam을 나타내고, 두 번째 반복에서는 jack을 나타낸다. 그리고 세 번쨰 반복할 단어가 없으므로 반복을 멈춘다.
word가 sam을 나타낼 때, word 도 마찮가지로 sam을 나타내며, 추가 명령이 없으므로, word을 리턴한다.(sam을 리턴한다.) 
word가 jack을 나타낼 때, word 도 마찮가지로 jack을 나타내며, 추가 명령이 없으므로, word을 리턴한다.(jack을 리턴한다.)
이렇게 리턴된 "sam" 과 "jack"이란 두 단어를 [ ] 혹은 list( )를 통해 ["sam", "jack"]으로 만든다.

이 과정을 그림으로 보면 아래와 같다.

그림을 보면 알겠지만, 사실 [word for word in input().split()]는 input().split()이랑 동일하다.
[word for word in input().split()] 대신 input().split()을 써도 되지만, 일단 generator를 알아야되기 때문에 이 과정으로 통해 계속 설명해보겠다.
여하튼, [word for word in input().split()] 로 나온 결과는 ["sam", "jack"] 이다.

2-3) [[word for word in input().split()] for y in range(num)]] 이해

[word for word in input().split()]이 이해가 가면, 전체적인 구문은 쉽게 이해할 수 있다. 반복할 뿐이기 때문이다.
num= 2 라고 한다면,
[word for word in input().split()] 이 과정을 두번 반복하는데, 반복할 때 마다 리턴되는 값을 [ ]을 통해 리스트에 넣는 방식이다.

뒤 for 반복문 generator에 의해 수행될 되는 것은 [word for word in input().split()]이다. 

[word for word in input().split()]의 값이 ["sam", "jack"] 이라는 것을 구한다.

[word for word in input().split()]의 값인 ["sam", "jack"]을 [ ]를 통해 list로 넣는다. 그림에서 있는 설명처럼 이때 2차원 list로 생성된다.

수행을 했으니 y는 다음 값으로 넘어간다.

두번째의 [word for word in input().split()]의 값이 ["ara", "jay"] 이라는 것을 구한다.

 

[word for word in input().split()]의 값인 ["ara", "jay"]을 [ ]를 통해 list로 넣는다.

이러한 과정을 통해 [["sam", jack"], ["ara", "jay"]] 라는 2차원 list가 생성된다.

 

정리를 하면, 
num = 숫자 <- 몇개의 2차원 리스트를 만들 것인지,
[[word for word in input().split()] for y in range(num)] 
혹은
num = 숫자 <- 몇개의 2차원 리스트를 만들 것인지,
[ input().split() for y in range(num)]

이렇게 하면 된다.

앞서 많이 다뤘듯이, 이것은 input().split()을 활용한 것이므로, 문자(열)을 받게 된다. 
숫자를 받으려면 map( ) 함수를 활용해야 된다. 
이는 다음 글에서 다룰 예정이다.

728x90
반응형

+ Recent posts