[Python] Udacity-DeepLearning | 리스트 요소 앞뒤 n개 값 반환

olxtar·2022년 7월 28일
0
post-thumbnail

Comment :

Udacity DeepLearning - RNN Lesson 5: Embeddings & Word2Vec에서의 Word2Vec 예시 코드를 보다가 약간... 코드문제같은 부분이 있어서 이처럼 문제로 작성하였다.



리스트 내 특정 값 앞뒤 n개의 값 반환하는 함수


- 문제

Implement a function get_target that receives a list of words, an index, and a window size, then returns a list of words in the window around the index.


글로 읽으니 직관적으로 와닿지가 않는다. 아래의 예시를 보자

  • input
    1. words : 숫자값(타입은 str)들이 나열된 리스트
    2. idx : 입력 리스트에서 (특정값의) 기준이 될 값의 위치 인덱스
    3. window_size : 앞뒤 n개의 값에서의 n의 범위
  • output : 입력 리스트 내 특정 값 앞 뒤 n개의 값 리스트

ex)
words = ['13', '486', '741', '69', '0', '896', '5533', '147', '96', '117']
idx = 2
window_size = 5

[!] 1~window_size 범위내에서 랜덤으로 1개의 정수값을 뽑는다. 만약 2가 나왔다고 하면

output = ['13', '486', '69', '0']







Solution

def get_target(words,
			   idx,
               window_size=5):

	R = np.random.randint(1, window_size+1)
    
    start = idx - R if (idx-R) > 0 else 0
    stop = idx + R
    target_words = words[start:idx] + words[idx+1:stop+1]
    
    return list(target_words)





설명

간단하게 리스트의 요소값은 숫자 String이지만 따옴표없이, 알파벳으로 대체해보자

words = [A, B, C, D, E, F, G, H, I, J]
idx = 2
window_size = 5

랜덤으로 돌린 R값이 2가 나왔다고하면

우리가 원하는 반환값은 [A, B, D, E]이다. 이는 words 리스트의 0~1 슬라이싱과 3~4 슬라이싱 값을 합친것이다. Python의 슬라이싱 및 인덱스 규칙에 의해서 words 리스트의 idx-R ~ idx값이 앞부분, idx+1 ~ idx+R+1값이 뒷부분이 된다. [+] idx에 해당하는 자기자신 값은 빠져야하므로 이와같이 된다.


Case1. R값이 idx값보다 크면?

idx값 기준으로 앞부분을 R만큼 떼가야하는데 idx값이 R보다 작으면? 예를 들어서 그냥 idx값이 0이면 앞에 있는 값이 없음! 따라서 if문을 통해서 idx > R을 확인해주고 False일 경우 start 인덱스 값인 start를 0으로 해줘야한다.


Case2. idx값이 words의 맨마지막 index라면?

li = [1,2,3,4,5,6,7,8,9,10]
print(li[11:12])

>>>
[]

위와 같이 Python에서 리스트의 인덱스를 벗어나는 값으로 슬라이싱하면 단순히 빈 리스트를 반환한다. 따라서 문제없음

profile
예술과 기술

0개의 댓글