bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
[[length[0],weight[0]], [length[1],weight[1]], [length[2],weight[2]] ... ]과 같은 방식으로 2차원 배열을 만들기 위해서는 어떻게하는 것이 좋을까?
방법1. 리스트 내포로 직접 구현하기
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
output =[]
for i in range(len(length)):
output.append(length[i])
output.append(weight[i])
n = 2
result = [
output[i*n:(i+1) *n]
for i in range((len(output) + n-1) //n)
]
print(result)
1-1) len(output)+n-1 // n이 의미하는 바를 알아보자. n은 내가 몇개씩 그룹화 하고 싶은지를 의미한다. 문제에서는 2개씩 그룹하기를 희망하므로 n에 2가 들어가는데 len(output) //n을 하게되면 len(ouput)이 홀수일 경우 나머지 한개를 버리게 된다. 그래서 n-1 을 더함으로써 len(ouput)이 홀수 일 경우에도 마지막이 1개 값이면 1개의 요소로써 그룹 시키게 한다. 그래서 홀수일 경우에도 +1을 하게하여 몇번을 반복할지 range를 구한다.
1-2) 첫번째로 i값에 0이 들어가게 되고 output[0 *2 : (0+1)*2]가 된다. output값을 정리하면 output[0 : 2]가 되므로 문자 슬라이싱이되어 output[0],output[1] 값을 리스트로 리턴해서 result에 저장하게된다. 두 번째 i값은 1이 되므로 output[1*2 : (1+1) *2]가 되며 정리하면 output[2:4]가 된다. 그러면 output[2], output[3] 값을 리스트로 리턴해서 result에 저장하게된다. 이런식으로 range가 끝날때 까지 반복된다.
여기서 슬라이싱에 사용된 표현법이 멋지다. 만약 3개씩 문자를 슬라이싱해서 가져오고 싶으면 ouput[i*3 : (i+1)*3]을 하게하면 되겠다.
방법2. zip함수 활용하기
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
length = bream_length+smelt_length
weight = bream_weight+smelt_weight
fish_data = [
[l, w]
for l, w in zip(length, weight)
]
print(fish_data)
zip함수에 리스트를 각각 집어넣고 l, w변수로 받은뒤 fish_data에 저장해준다. 매우 간단하다.
zip함수가 어떻게 작성되어 있는지는 알 수 없으나 경우에 따라서는 리스트 내포로 구현한 것이 속도가 더 빠를 수도 있지 않을까 생각하기 때문에 두가지 모두 아는 것이 좋겠따. 어려운 것이아니라 익숙하지 않은 것. 여러번 반복해서 다음에는 이런 기술을 활용할 수 있도록하자.
댓글