intro
- lambda할때 비슷한 형태가 나오긴했는데
lambda는 익명함수가 메인이었으면
이건 좀 다름. - LC는 for문을 간결하게 쓰는게 목적임.
먼저 일반적인 경우를 생각했을 때
1 2 3 4 5 6
l = [] for i in range(10): if i % 2 == 0: l.append(i * i) print(l)
이 뭉탱이가
1 2
nl = [i*i for i in range(10) if i % 2 == 0] print(nl)
이렇게 써도 같은 결과를 얻는다.
structure
기본 구성은 다음과같다.
1
somelist = [ expression(i) for i in data if condition(i)]
- 결과는 somelist로 list.
- 식을 보면
[ ]으로 묶는데
그래서 결과도 list인듯. - 또, list가 제일 쉬움
- 식을 보면
- 몸체는 for문
- data랑 item 나열
- condition에 true로 걸리는애들이 1차 결과.
- 필터라고 생각하면 됨
- 1차로 걸리진 애들을 expression으로 계산
- list에 들어갈 최종 item.
- 딱히 계산이 없어도 var은 있어야함
- 결과는 somelist로 list.
조건, 계산만 잘 써먹으면
이것저것 다 쓸 수 있을것 같음.1 2 3 4 5 6
s = "a dog is a good dog".split() l = [i[0] for i in s if len(i) > 2] print(l) # ['d', 'g', 'd']
for 중첩 - 1
for문 중첩을 이용할 수 있음
1 2 3 4 5 6 7 8 9 10
cafelist = ['twosome', 'starbucks'] coffeelist = ['cappuccino', 'latte'] l = [(cf, cfe) for cfe in coffeelist for cf in cafelist] print(l) #[('twosome', 'cappuccino'), # ('starbucks', 'cappuccino'), # ('twosome', 'latte'), # ('starbucks', 'latte')]
for 중첩으로 쓸 수 있는데
사실 이 경우 중첩보다는
결과 뽑아낼때 형태때문에…
for 중첩 - 2
직접 for이랑 비교해보면
1 2 3
l = [[1,2,3],[4,5,6],[7,8,9]] nl = [y for x in l for y in x] print(nl)
1 2 3 4 5 6
l1 = [[1,2,3],[4,5,6],[7,8,9]] nl = [] for x in l1: for y in x: nl.append(y) print(nl)
둘은 같은 결과로
1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
이게 나옴
한단계 더 해서
1 2 3
l2 = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]] nl = [z for x in l2 for y in x for z in y] print(nl)
1 2 3 4 5 6
nl = [] for x in l2: for y in x: for z in y: nl.append(z) print(nl)
둘은 같은 결과로
1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
- 대충 나온것같다.
- for가 중첩되는경우,
안쪽블록으로 들어갈 for문이
LC에서는 오른쪽에 배치하면되고
결과 item은 가장 왼쪽.
for 중첩 - 3
- 다음으로
위 예제는 sublist가 다 꺠진다
2차 list에서 1차list가 된다. 이 형태를 깨지 않으려면?
1 2 3 4 5 6 7 8
l = [[1,2,3],[4,5,6],[7,8,9]] nl = [] for x in l: sl = [] for y in x: sl.append(y*y) nl.append(sl) print(nl)
결과는
1
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]
지금까지 내용으로 LC로 바꾸면
1 2
nl = [y*y for x in l for y in x] print(nl)
이것밖에 안됨.
구조가 깨짐.원하는 결과를 얻으려면
1 2
nl = [[x*x for x in y] for y in l] print(nl)
이게 원하던 결과인
1
[[1, 4, 9], [16, 25, 36], [49, 64, 81]]
가 나온다
- 이 결과는 혼자였으면 절대 몰랐을듯..
- 근데
[x*x for x in y]를
X로 치환하면
X for in l로 얼추 비슷해지는데
X또한 list로 반환한다는점을 보면
이해가 좀 되는것같기도하고.. - 지금도 충분히 복잡하니까 3중은 넘어가자..
if 중첩
여기도 중첩이 되는데
1 2 3 4 5 6 7
l = list(range(50)) l1 = [i for i in l if i % 2 == 0 and i % 3 == 0] l2 = [i for i in l if i % 2 == 0 or i % 3 == 0] l3 = [i for i in l if i % 2 == 0 if i % 3 == 0] # [0, 6, 12, 18, 24, 30, 36, 42, 48]
- 딱 이것 ’ 만 ’ 된다
- 이거 외에 다른식으로 쓰는건 전부 안됨
- 귀찮아서 안쓰겠음.
- 통일성있게
if는 터음에 한번만 쓰고
뒤에는 and, or붙이는게 좋을것같음.
outro
- 약간 linq같은 느낌인데 문제는
for건, if건 중첩이 되면
애가 좀 망가짐 - 다른 언어도 마찬가지로
한 블록안에 들여쓰기가 많아지면
애가 좀 안이뻐지는데
python 은{ }도 없어서
약간 불편한것도 있음.
이런걸로 간편히 써서
이쁘게 잘 쓰는게 좋을듯. - 단순하게 표현해주는건 맞는데
간단한 경우에만 써는느낌.. - 복잡한 경우 map, filter등의
다른 방법도 있다하니
더 알게되면 잘 쓰겠지뭐..
Comments powered by Disqus.