리스트 탐색

2022. 10. 22. 23:44파이썬(Python)

반응형

1. 리스트에 있는 원소의 인덱스 구하기

1-1. for loop

- 몇 번째 index에 있는지 저장해 줄 idx 변수를 사용.

word=['a','b','c','d','e']
val=input()
idx=-1

for i in range(len(word)):
    if word[i]==val:
        idx=i

if idx==-1:
    print('not exist')
else:
    print('exist')
    print(f'{val}의 index는 {idx}')

결과

>> b
b의 index는 1
exist

>> f
not exist

 

1-2 enumerate()

- 리스트를 enumerate로 감싸 for loop를 사용하면 (index, 원소)와 같이 튜플로 반환

word=['a','b','c','d','e']
idx=-1

for i in enumerate(word):
    print(i)

결과

(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')

 

- enumerate를 사용해서 원하는 원소의 index를 구할 수 있음

word=['a','b','c','d','e']
val=input()
idx=-1

for i,j in enumerate(word):
    if j==val:
        idx=i

if idx==-1:
    print('not exist')
else:
    print('exist')
    print(f'{val}의 index는 {idx}')

 

1-3. index()

- 리스트에 존재하는 원소의 index를 찾기 위해 사용

- 리스트에 존재하지 않는 원소에 사용하면 Value error 발생

- 해당 원소가 리스트에 포함되는지 확인 후 사용.

word=['a','b','c','d','e']
val=input()
idx=-1

if val in word:
    print(word.index(val))

else:
    print('not exist')

2. 특정 값의 개수 구하기

2-1. for loop

- cnt 변수를 활용해 for loop 사용

word=['a','b','a','b','b']
val=input()
cnt=0

for i in word:
    if i==val:
        cnt+=1

print(f'{val}의 개수는 {cnt}')

결과

>> b
b의 개수는 3

 

2-2. count()

- 리스트에 내장 함수인 count를 사용해 특정 원소의 개수를 구할 수 있음.

word=['a','b','a','b','b']
val=input()

print(word.count(val))

결과

>> a
2

Q) 탐색 프로그램

- n, q 입력 (n : 원소 개수, q : 질의 개수)

- n개의 원소 입력

- q개의 질의 입력

 

▷ 질의

- print a  =>  a번째 원소 출력

- exist a  =>  a가 있는지 판단.

  - 있으면 몇 번째 원소인지 출력.

  - 2개 이상 있으면 더 작은 index를 출력

  - 없으면 0 출력

- print a b  =>  a번째부터 b번째까지 순서대로 출력

- 순서는 1번째부터 n번째까지

n,q=map(int,input().split())
arr=list(map(int,input().split()))

for i in range(q):
    query=input().split()
    
    if query[0]=='print':
        
        if len(query)==2:
            idx=int(query[1])
            print(f'>> {arr[idx-1]}')
        
        else:
            a,b=int(query[1]),int(query[2])
            print('>>',end=' ')

            for j in range(a,b+1):
                print(arr[j-1],end=' ')
            print()
    
    else:
        a=int(query[1])
        
        if a in arr:
            print('>>',arr.index(a)+1)
        
        else:
            print('>>', 0)

- 질의를 입력받고 split을 사용해 리스트로 변환

- print는 숫자를 1개 받을 때, 2개 받을 때로 나눠서 적용

- 문제에서 1번째부터 시작함. 따라서 리스트는 0번째로 시작하므로 주의

- exist는 index를 사용해 index 반환. 

 

결과

5 5
3 2 4 5 4
print 4
>> 5
exist 4
>> 3
exist 5
>> 4
print 1 5
>> 3 2 4 5 4 
print 2 5
>> 2 4 5 4

Q) 연속 부분 수열

- n개의 원소로 이루어진 수열 A 입력

- m개의 원소로 이루어진 수열 B 입력

- 수열 B가 수열 A의 원소들을 연속하게 뽑으면 연속 부분 수열

- A : [1, 2, 3, 4]

- B1 : [1, 2]

- B2 : [2, 4]

- B1은 A의 연속 부분 수열

- B2는 A의 연속 부분 수열 X

 

a=list(map(int,input().split()))
b=list(map(int,input().split()))

ans=False
for i in range(len(b)):
    for j in range(len(a)):
        if b[i]==a[j]:
            if a[j:j+len(b)]==b:
                ans=True
                break

if ans==True:
    print('Yes')
else:
    print('No')

- ans는 bool type의 변수. True이면 연속 부분 수열. False이면 연속 부분 수열 아님

- b의 연속 부분 수열의 시작 원소가 a에 있으면

  - 원소의 index를 j라 하고, a에서 j부터 len(b)+j까지 slicing

  - slicing 한 리스트와 b가 같으면 ans는 True

 

결과

>> 1 2 3 4 5
>> 2 3 4
Yes
>> 1 2 3 4 5
>> 2 3 5
No

Q) 숫자가 등장하는 위치

- 자연수 a, b를 입력

- 여러 개의 숫자를 입력

- a가 b번째로 등장할 때 몇 번째 위치의 글자인지 출력

 

a,b=map(int,input().split())
arr=list(map(int,input().split()))

cnt=0
for i in range(len(arr)):
    if arr[i]==a:
        cnt+=1
    if cnt==b:
        print(f'{a}의 {b}번째 등장하는 위치는 {i+1}이다.')
        break

if cnt!=b:
    print(f'{a}가 {b}번 등장하지 않음')

- for loop를 사용해서 arr [i]가 a와 같으면 cnt(개수)를 1 증가한다.

- cnt가 b와 같으면 index를 나타내는 i에 1을 더해 위치를 출력하고 break를 통해 탈출한다.

- cnt가 b와 같지 않다면 a가 b번 등장하지 않는다고 출력한다.


 

'파이썬(Python)' 카테고리의 다른 글

리스트 최대 최소 2  (0) 2022.10.25
리스트 최대, 최소  (0) 2022.10.23
Count 리스트  (0) 2022.10.15
리스트 만들기  (0) 2022.10.14
리스트와 인덱스  (0) 2022.10.10