고수님들 파이썬 엑셀파일 만드는 코드좀 부탁드립니다

조회수 312회
  • 첫번째 행은 "아무나"
  • 두번째 행은 010-xxxx-yyyy 로 저장이되는데
    • 여기서 xxxx나 yyyy 3번 이상 같은 숫자가 아닌 것입니다(ex 010-1111-1234 안됨)

한마디로 모든 전화번호를 저장하는 엑셀파일을 만들고 싶은데 xxxx안이나 yyyy안에서 같은 숫자가 3자리 이상 없는 전화번호입니다.

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    "3번 이상 같은 숫자가 아닌 것" 라는 설명이 애매모호하네요. 대충 해석해서 해보면요.

    이런 숫자조합 같은 걸 위해선 itertools 를 잘 사용하면 좋습니다.

    itertools.product 란 것이 있습니다.

    1234를 두번 써서 나올 수 있는 모든 경우를 나열합니다.

    >>> list(itertools.product(list("1234"), repeat=2))
    [('1', '1'), ('1', '2'), ('1', '3'), ('1', '4'),
     ('2', '1'), ('2', '2'), ('2', '3'), ('2', '4'),
     ('3', '1'), ('3', '2'), ('3', '3'), ('3', '4'),
     ('4', '1'), ('4', '2'), ('4', '3'), ('4', '4')]
    

    제한조건 없이 4자리 숫자를 만드려면 itertools.product(list("0123456789"), repeat=4) 라고 하면 됩니다. 0~9 까지 숫자를 4번 써서 모든 경우를 구하는 겁니다.

    3번이상 같은 숫자가 아닌 것이란 말을, 4자리 숫자가 2종류 이상초과로 구성된다고 해석했습니다. 그럼 같은 숫자가 3개 이상 나올 수 없습니다.

    이 조건을 포함해서 구하려면, 4자리 숫자 전체경우에서 filter 라는 함수를 적용해서 필터링하면 됩니다.

    >>> xxxx = list(filter(lambda l: len(set(l)) > 2, itertools.product(list("0123456789"), repeat=4)))
    >>> len(xxxx)
    9360
    >>> xxxx[:10]
    [('0', '0', '1', '2'), ('0', '0', '1', '3'), ('0', '0', '1', '4'), ('0', '0', '1', '5'), ('0', '0', '1', '6'), ('0', '0', '1', '7'), ('0', '0', '1', '8'), ('0', '0', '1', '9'), ('0', '0', '2', '1'), ('0', '0', '2', '3')]
    

    튜플을 문자열로 바꿉니다.

    >>> xxxx = [ ''.join(l) for l in xxxx ]
    >>> xxxx[:10]
    ['0012', '0013', '0014', '0015', '0016', '0017', '0018', '0019', '0021', '0023']
    

    xxxx, yyyy 이 만들어지는 조건은 똑같으니까, 이 xxxx 세트를 가지고 다시 2개씩 뽑아 모든 경우를 구하여 전화번호 꼴로 만듭니다.

    >>> xxxxyyyy = [ "-".join(it) for it in itertools.product(xxxx, repeat=2) ]
    >>> len(xxxxyyyy)
    87609600
    >>> xxxxyyyy[:5]
    ['0012-0012', '0012-0013', '0012-0014', '0012-0015', '0012-0016']
    >>> xxxxyyyy[3435]
    '0012-3679'
    >>> xxxxyyyy[3030939]
    '0363-8177'
    
    

    pandas 를 이용해서 excel 로 내보내 봅시다.

    >>> import pandas as pd
    
    
    
    >>> data = [ "010-"+s for s in xxxxyyyy ]
    
    >>> df = pd.DataFrame(data, columns = ["아무나"])
    >>> df
                        아무나
    0         010-0012-0012
    1         010-0012-0013
    2         010-0012-0014
    3         010-0012-0015
    4         010-0012-0016
    ...                 ...
    87609595  010-9987-9983
    87609596  010-9987-9984
    87609597  010-9987-9985
    87609598  010-9987-9986
    87609599  010-9987-9987
    
    [87609600 rows x 1 columns]
    >>> df.to_excel("c:\\temp\\전화번호.xlsx")
    Traceback (most recent call last):
      File "<pyshell#28>", line 1, in <module>
        df.to_excel("c:\\temp\\전화번호.xlsx")
      File "C:\PROGRAMS\Python3864\lib\site-packages\pandas\core\generic.py", line 2284, in to_excel
        formatter.write(
      File "C:\PROGRAMS\Python3864\lib\site-packages\pandas\io\formats\excel.py", line 823, in write
        raise ValueError(
    ValueError: This sheet is too large! Your sheet size is: 87609600, 1 Max sheet size is: 1048576, 16384
    

    데이터가 너무 많아서 엑셀파일로는 만들어지지 않습니다. csv 로 시도합니다.

    >>> df.to_csv(r"c:\temp\전화번호.csv", index=False)
    
    • 감사합니다 저렇게 코드를 짜면 혹시 010-0100-1234 같은 번호도 저장되는 건가요? 가운데 4자리에 0이 3번 들어가는데 저러면 안돼서 여쭤봅니다 박민기 2022.12.23 13:11
    • @박민기 : 0100 에는 0이 3번 이상 있으니 빠져야 하는 것으로 이해하고 만들었습니다. nowp 2022.12.23 17:09
    • 정말 죄송한데 마지막으로 xxxx와 yyyy가 같은 경우 리스트에서 삭제하는 코딩 부탁드려도 될까요? 값이 너무 커서 조금이라도 줄이고 싶은 이유입니다 박민기 2022.12.23 18:55

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

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

(ಠ_ಠ)
(ಠ‿ಠ)