파이썬 일치된 숫자 위치찾기

조회수 1504회

안녕하세요. 파이썬 초보입니다 저장된 데이터에 입력한 회차 범위만큼의 값인 숫자가 일치하는것이 있다면 일치하는 회차번호 전부를 출력하고 싶습니다

저장된 데이터(data.txt)

1012137
8
1012136
4
1012135
3
1012134
0
1012133
4
1012132
8
1012131
4 .
..

예를들면 찾는범위 회차번호 1012137과 1012136 을 입력하면 그값이 8과 4 입니다

값이 8과4 순서대로 일치하는 모든 데이터의 회차 번호를 알고 싶은데요(예 : 1012132, 1012131번 일치)

f1 = open('data.txt', mode='r', encoding='utf-8')
lines = f1.readlines()
start = int(input("낮은 조회 회차 입력: "))
last = int(input("높은 조회 회차 입력: "))

# 입력한 크기만큼 배열에 담기
lst = []
for i in range(start, last + 1):
    lst.append(str(i) + '\n')    
    lst.reverse()

# 두개의 리스트간 동일한 요소찾기
list_group = list(set(lst).intersection(lines))
list_group.sort()
print(list_group)

# lines에 동일한요소 인덱스찾기(회차 기준)
index_num = []
for i in list_group:
    for d in lines:    
        if d == i:    
            index_num.append(lines.index(d))
index_num.sort()

# 인덱스기준 다음 숫자을 포함하기위해 인덱스 찾기
index_odd_oven = []
Duplicate_list = []  # 중복찾기
for i in index_num:
    index_odd_oven.append(i + 1)    
    Duplicate_list.append(i)


# 중복 찾기(에러)
a = []
for i in Duplicate_list:
    a.append(lines[i])  


word_cnt = dict()
for word in a:
    if word not in word_cnt.keys():    
        word_cnt[word] = 1    
    else:    
        word_cnt[word] += 1

for key, value in word_cnt.items():
    if value > 1:    
        print("error========error=======error===========")    
        print(key, value)

value = []
for i in index_odd_oven:       # [0, 2]
    value.append(lines[i])      #  ['8\n', '4\n']    

f1.close()

여기서 값인 8과 4를 전체 데이터와 비교해 그값이 일치하는 회차번호 전부를 찾고 싶은데 어떻게 코드를 짜야할까요?

초보질문이라 죄송하고 감사합니다.

1 답변

  • 일단, 데이터와 로직을 다시 정리하고 생각해보신 후 구현하시기 바랍니다.

    데이터는 값인 key와 회차번호인 value로 이루어져 있습니다.

    찾으시려는 기준은 회차번호가 아닌 '값'이으로 key가 '값', value가 회차번호입니다.

    value가 배열로 되어 있다면, key 값을 알 때 회차번호를 쉽게 찾을 수 있을 것 같습니다. 그 경우, key-value 쌍의 상태는 아래와 같습니다.

    값 : 회차번호들

    1 : [1012121, 1012123, 1012111]

    2 : [1012124, 1012128, 1012116, 1012105]

    3 : [...]

    ...

    위와 같이 정리하기 위해서는 여러 방법이 있지만 가장 단순한 방법인 for문과 dictionary로 구현하면 다음과 같습니다.

    dictionary의 key는 중복을 허용하지 않습니다.

    dict = {}
    lines = list(map(int, f1.readlines()))  # 라인의 모든 값을 int형으로 변경합니다.
    print(lines)
    for i in range(0, len(lines)-1, 2):  # key value 쌍이므로 2씩 증가하며 반복합니다.
        if lines[i + 1] in dict: # 딕셔너리에 key가 이미 있는 경우 해당하는 회차번호를 list에 추가
            dict[lines[i + 1]].append(lines[i])
        else: # 딕셔너리에 key가 없는 경우 list 생성
            dict[lines[i + 1]] = [lines[i]];
    print(dict)
    

    질문이 값인 8과 4를 전체 데이터와 비교해 그값이 일치하는 회차번호 전부를 찾고 싶은데 어떻게 코드를 짜야할까요??? 였었죠?

    위 같이 정리하고 나면 dict[4],dict[8] 을 합치면 원하시는 결과가 됩니다.

    resultList = []
    for v in value: # value는 구하셧던 값 리스트와 같습니다.(int list)
        resultList += dict[v]
    print(resultList)
    

    # 첫부분에서 전부 int형으로 변경하였기에 value가 ['8\n', '4\n'] 인 경우 동작하지 않습니다. ex) value = [8, 4]

    질문하실 때 코드를 단계와 기능을 설명하며 나누신건 좋은데 질문과 무관계한 코드가 너무 많습니다. 무관계한 코드는 되도록 넣지 않는게 좋습니다. 길면 아무도 읽지 않습니다.

    입출력과 의사코드, 설명 정도만 작성해 주시면 좋을 것 같습니다.

    추가로, 마지막의 value는 리스트의 변수명으로 심하게 부적절합니다.

    감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)