어제 오늘 내일

[Python 실전] "좌표를 찍어라!" 2차원 리스트 데이터 위치 찾기 본문

IT/Python

[Python 실전] "좌표를 찍어라!" 2차원 리스트 데이터 위치 찾기

hi.anna 2026. 5. 25. 07:01

 
데이터가 바둑판처럼 나열된 2차원 리스트에서 우리가 원하는 값을 찾으려면 "몇 번째 줄(행), 몇 번째 칸(열)"인지 알아내야 합니다. 상황에 맞는 세 가지 해결책을 소개합니다.


1. 가장 정석적인 방법: 중첩 문과

가장 직관적이고 가독성이 좋은 방법입니다. enumerate()를 두 번 중첩해서 사용하면 행 번호와 열 번호를 동시에 얻을 수 있습니다.

📌 예제 코드: 특정 값의 모든 좌표 찾기

grid = [
    ["A", "B", "C"],
    ["D", "Target", "F"],
    ["G", "H", "Target"]
]

target = "Target"
locations = []

# r: 행 번호, row: 해당 행의 리스트
for r, row in enumerate(grid):
    # c: 열 번호, val: 실제 값
    for c, val in enumerate(row):
        if val == target:
            locations.append((r, c)) # 좌표를 튜플 형태로 저장

print(f"'{target}'의 위치 목록 (행, 열):", locations)
# 출력: 'Target'의 위치 목록 (행, 열): [(1, 1), (2, 2)]

2. 고수의 한 줄 컷: 리스트 컴프리헨션 활용

위의 복잡한 5줄 코드를 단 한 줄로 줄일 수 있습니다. 코드가 간결해져서 실무에서 위치를 빠르게 뽑아낼 때 자주 쓰입니다.

📌 예제 코드: 리스트 컴프리헨션으로 좌표 추출

grid = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 20, 90]
]

target_value = 20

# (r, c) 좌표를 담는데, r행의 c열 값이 target_value와 같을 때만 담아라!
coords = [(r, c) for r, row in enumerate(grid) for c, val in enumerate(row) if val == target_value]

print(f"값 {target_value}의 위치:", coords)
# 출력: 값 20의 위치: [(0, 1), (2, 1)]

3. 조건에 맞는 첫 번째 위치만 빠르게 찾기

데이터가 아주 방대할 때, 모든 위치를 다 찾을 필요 없이 처음 발견된 곳에서 바로 검색을 중단하고 싶을 때 쓰는 효율적인 방식입니다.

📌 예제 코드:  함수와 제너레이터 활용

grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 5라는 숫자의 위치를 찾자마자 종료
target = 5

# next()는 조건에 맞는 첫 번째 결과가 나오면 즉시 반환하고 멈춥니다.
# 만약 없다면 "찾을 수 없음"을 반환합니다.
found = next(((r, c) for r, row in enumerate(grid) for c, val in enumerate(row) if val == target), "찾을 수 없음")

print(f"숫자 {target}의 첫 번째 위치:", found)
# 출력: 숫자 5의 첫 번째 위치: (1, 1)

📝 요약 및 실무 팁

  • 모든 위치가 필요할 때: 중첩 enumerate()를 쓴 리스트 컴프리헨션이 가장 깔끔합니다.
  • 가장 먼저 나오는 하나만 필요할 때: next() 함수를 써서 속도를 높이세요.
  • 성능 팁: 리스트가 수만 행 이상으로 크다면, 리스트 대신 NumPy 라이브러리의 np.where() 함수를 사용하는 것이 훨씬 빠릅니다.

2차원 리스트에서 위치를 찾는 법까지 익히셨으니, 이제 격자 형태의 데이터를 자유자재로 다루실 수 있겠네요!
 

반응형
Comments