반응형

https://pypi.org/project/jaconv/

 

jaconv

Pure-Python Japanese character interconverter for Hiragana, Katakana, Hankaku, Zenkaku and more

pypi.org

다운로드

pip install jaconv

 

기능

히라가나 -> 가타카나 전환

가타카나 -> 히라가나 전환

가능하다

 

영어 -> 히라가나

히라가나 -> 영어 기능도 제공한다고 위키에는 나와 있으나,

실험해보니 해당 기능은 부족한 부분이 있는 것으로 보인다

 

import jaconv

# Hiragana to Katakana
jaconv.hira2kata('ともえまみ')
# => 'トモエマミ'

# Hiragana to half-width Katakana
jaconv.hira2hkata('ともえまみ')
# => 'トモエマミ'

# Katakana to Hiragana
jaconv.kata2hira('巴マミ')
# => '巴まみ'

# half-width character to full-width character
# default parameters are followings: kana=True, ascii=False, digit=False
jaconv.h2z('ティロ・フィナーレ')
# => 'ティロ・フィナーレ'

# half-width character to full-width character
# but only ascii characters
jaconv.h2z('abc', kana=False, ascii=True, digit=False)
# => 'abc'

# half-width character to full-width character
# but only digit characters
jaconv.h2z('123', kana=False, ascii=False, digit=True)
# => '123'

# half-width character to full-width character
# except half-width Katakana
jaconv.h2z('アabc123', kana=False, digit=True, ascii=True)
# => 'アabc123'

# an alias of h2z
jaconv.hankaku2zenkaku('ティロ・フィナーレabc123')
# => 'ティロ・フィナーレabc123'

# full-width character to half-width character
# default parameters are followings: kana=True, ascii=False, digit=False
jaconv.z2h('ティロ・フィナーレ')
# => 'ティロ・フィナーレ'

# full-width character to half-width character
# but only ascii characters
jaconv.z2h('abc', kana=False, ascii=True, digit=False)
# => 'abc'

# full-width character to half-width character
# but only digit characters
jaconv.z2h('123', kana=False, ascii=False, digit=True)
# => '123'

# full-width character to half-width character
# except full-width Katakana
jaconv.z2h('アabc123', kana=False, digit=True, ascii=True)
# => 'アabc123'

# an alias of z2h
jaconv.zenkaku2hankaku('ティロ・フィナーレabc123')
# => 'ティロ・フィナーレabc123'

# normalize
jaconv.normalize('ティロ・フィナ〜レ', 'NFKC')
# => 'ティロ・フィナーレ'

# Hiragana to alphabet
jaconv.kana2alphabet('じゃぱん')
# => 'japan'

# Alphabet to Hiragana
jaconv.alphabet2kana('japan')
# => 'じゃぱん'

# Katakana to Alphabet
jaconv.kata2alphabet('ケツイ')
# => 'ketsui'

# Alphabet to Katakana
jaconv.alphabet2kata('namba')
# => 'ナンバ'

# Hiragana to Julius's phoneme format
jaconv.hiragana2julius('てんきすごくいいいいいい')
# => 't e N k i s u g o k u i:'

히라가나 - 가타카나 가타카나 - 히라가나 전환만 필요한 경우 해당 라이브러리를 이용하면 편리하다

반응형
반응형

python으로 pip 설치를 진행하다가 에러가 발생하였다

 

에러

[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: python.exe -m pip install --upgrade pip

 

에러의 원인은 버전이 낮아서 발생하는 것으로 pip upgrade가 필요하다

 

해결방법

사실 해당 에러는 매우 간단하다

python.exe -m pip install --upgrade pip

파이썬이 안내해주는 방식 그대로 사용하면 해결 가능하다!

 

해당 방법으로 pip를 업그레이드한 후 본래 사용하고 싶었던 명령어를 사용할 수 있었다.

반응형
반응형

Python  가상환경 사용하기

Python에서는 가상 환경을 사용할 수 있고 특병 프로젝트에 맞춰서 패키지를 다르게 독립적으로 설정해줄 수 있다

버전관리나 동일한 환경에서 다른사람들과 작업하기 편리하다

Python 가상환경 생성하기

python -m venv '가상 환경 이름'

Python 가상환경 활성화하기

생성된 가상 환경으로 이동 후 활성화

cd '가상 환경 이름 '
source Scripts/activate

해당 명령어를 입력하면 하단에('가상환경이름') 가상환경이 연결된걸 확인할 수 있다.

나의 경우 venv로 대충 지음

 

bash에 입력시

 

sou + Tab S + Tab a + Tab 

Tab 입력시 간편하게 자동완성 해준다

가상 환경에 패키지 설치

가상 환경에 접속 후 pip를 사용해서 패키지를 설치할 수 있다

pip install requests

위의 명령어를 입력하면 전역 환경에는 깔리지 않지만 나의 venv환경에서는 requests 라이브러리가 추가된다!

가상환경 비활성화

deactivate

입력하면 bash 하단의('가상환경이름') 이 사라진다

 

가상환경 삭제

가상환경 삭제는 간단하게 해당 가상환경이 포함된 폴더늘 삭제 해주면 된다

rmdir

 

추가 팁

내가 설치한 패키지와 버전을 한번에 txt 파일로 뽑아낼 수 있다.

pip freeze > requirements.txt

그리고 이대로 설치도 가능하다

pip install -r requirements.txt
반응형
반응형

Python에서 문자열을 구분자로 분할할 때 str.split 을 사용해서 분리한다

그런데, 구분자가 여러개일 때의 분리가 필요해서 찾아보게 되었다.

 

re.split 사용법

import re

result = re.split(pattern, string, maxsplit=0, flags=0)

re를 import 해준다

 

pattern : 구분자 패턴

string : 분할할 문자열

maxsplit=0 : 수행할 최대의 분할 수로, 기본값은 0(생략가능)

flags=0 : 선택적 플래그 인자(생략가능)

 

여러 구분자로 나누기

ex)

text = "가1나다라1마바사2아자차1카타"

print(text.split("1"))

print(re.split("1|2",text))

결과값
['가', '나다라', '마바사2아자차', '카타']
['가', '나다라', '마바사', '아자차', '카타']

구분자는 "|" 로 나눌 수 있다

혹은 [] 대괄호 안에 넣어서 구분할 수도 있다

text = "가1나다라1마바사2아자차1카타"

print(text.split("1"))

print(re.split("[12]",text))

결과값
['가', '나다라', '마바사2아자차', '카타']
['가', '나다라', '마바사', '아자차', '카타']

 

공백으로 나누기

text = "가 나다라    마바사  아자차 카타"

print(text.split(" "))

print(re.split(r"\s",text))

print(re.split(r"\s+",text))


결과값
['가', '나다라', '', '', '', '마바사', '', '아자차', '카타']
['가', '나다라', '', '', '', '마바사', '', '아자차', '카타']
['가', '나다라', '마바사', '아자차', '카타']

\s 문자열 패던을 입력하면 공백으로 나눌 수 있다
\s+를 사용하면 공백이 여러개라도 하나의 공백으로 처리해서 나눌 수 있다!

 

maxsplit

text = "가 나다라    마바사  아자차 카타"

print(re.split(r"\s+",text, maxsplit=1))
print(re.split(r"\s+",text, maxsplit=2))
print(re.split(r"\s+",text, maxsplit=3))

결과값
['가', '나다라    마바사  아자차 카타']
['가', '나다라', '마바사  아자차 카타']
['가', '나다라', '마바사', '아자차 카타']

maxsplit 은 분할을 제한한다

 

값이 1이면 2개로 분할, 2이면 3으로 분할... 이런식으로 분할은 해당 값 만큼 분할 되어서 나온 결과값은 값+1

 

flag는 사실 뭘 하는건지 모르겠다...

re.split을 이용해서 크롤링 값을 나눠서 저장하는거에 유용하게 사용했다

 

 

https://docs.python.org/3/library/re.html

반응형
반응형

python 재귀 제한 해제

import sys
sys.setrecursionlimit(10**6)
반응형
반응형

1. 2차원 리스트

아직도 행과 열의 방향이 헷갈린다

2차원 리스트는 1차원리스트를 묶어놓은 list로 세로길이와 가로기링를 필요로 한다.

 

2. 2차원 리스트 만들기

 

  - 리스트의 행 과 열 M, N을 받아오는 경우

N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
print(arr)

input 값이 아래와 같은 경우 N = 2, M = 3이 할당된다 (N의 값은 생략 해도 된다)

# input 값
# 2 3
# 1 2 3
# 4 5 6

# 출력 값
[[1, 2, 3], [4, 5, 6]]

- 비어있는 리스트 만들기

arr = [[0] * M for _ in range(N)]

0의 값을 가지고 있는 M*N 크기의 2차원 리스트 만들기

 

아래의 방법으로도 가능하다

arr = [[0]*M]*N

하지만 이 방법으로 2차원 리스트를 만들면 값을 얉은 복사로 불러오기 때문에 값에 접근하면 문제가 생길 수 있다

arr = [[0]*M]*N

arr[0][1] = 1

print(arr)


# 출력값
#[[0, 1, 0], [0, 1, 0]]

arr[0][1]의 값을 변경해주었는데 해당 값을 참조하는 arr[1][1]의 값도 1로 바뀐다.

 

3. 리스트 값에 접근하기

arr[i][j]

i = 세로 인덱스

j = 가로 인덱스 입력을 통해 값에 접근 가능하다.

반응형
반응형

파이썬 공식문서

list.append(x)
리스트의 끝에 항목을 더합니다. a[len(a):] = [x] 와 동등합니다.

list.extend(iterable)
리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장합니다. a[len(a):] = iterable 와 동등합니다.

직접 해보기

int로 이루어진 list

my_list_1 = [1, 2, 3]
my_list_2 = [4, 5, 6]

 

 

my_list_1.append(my_list_2)
print(my_list_1)
[1, 2, 3, [4, 5, 6]]

-> my_list_2 의 항목이 한번에 들어가서 2중 리스트의 형태를 만든다

my_list_1.append(4)
print(my_list_1)
[1, 2, 3, 4]

-> 4가 리스트로 감싸지지 않아 바로 리스트에 들어간다

my_list_1.extend(my_list_2)
print(my_list_1)
[1, 2, 3, 4, 5, 6]

-> my_list_2의 항목이 순서대로 돌며 my_list_1의 뒤에 추가된다

my_list_1.extend(4)
print(my_list_1)
my_list_1.extend(4)
TypeError: 'int' object is not iterable

-> 4는 iterable한 인자가 아니라 TypeError를 일으킨다

 

str으로 이루어진 list

my_list_3 = ['apple', 'banana']
my_list_4 = ['coffe', 'milk']

 

my_list_3.append(my_list_4)
print(my_list_3)
['apple', 'banana', ['coffe', 'milk']]

-> my_list_4의 항목이 리스트 통채로 들어간다

my_list_3.append('grape')
print(my_list_3)
['apple', 'banana', 'grape']

-> grape 항목이 그대로 추가된다

my_list_3.extend(my_list_4)
print(my_list_3)
['apple', 'banana', 'coffe', 'milk']

-> 리스트의 항목이 개별적으로 추가된다

my_list_3.extend('grape')
print(my_list_3)
['apple', 'banana', 'g', 'r', 'a', 'p', 'e']

-> 문자열 'grape'를 돌며 요소 하나하나씩 list에 추가된다

 

 

개인적인 생각으론 .append()는 입력된 값을 통채로 집어넣는다

.extend()는 입력된 값을 순회하며 값을 하나씩 분리해서 집어넣는다고 느끼면 될 것 같다

반응형
반응형

list에서 사용할 수 있는 메서드들을 복습겸 정리해봤다

dir(list)

dir(list)로 리스트에서 사용할 수 있는 메서드들을 모두 출력해서 확인 할 수 있다

list_method = dir(list)
print(list_method)

실행결과

'__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__','append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'

append(x)

리스트에 요소 추가

my_list.append(10)
print(my_list)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

copy()

리스트 복사

my_list_2 = my_list.copy()
print(my_list_2)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

복사된 리스트 변경해보기

my_list_2[0] = 11
print(my_list_2)
print(my_list)
[11, 3, 5, 7, 9, 8, 4, 6, 2, 10]
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10]

-> .copy()를 통해 복사한 리스트는 다른 id 값을 가지고 있어서 복사본의 변경이 영향을 미치지 않는다

count(x)

리스트가 가지고 있는 x 의 갯수 세기

print(my_list.count(1))
1

extend(iterable)

리스트의 뒤에 iterable한 항목을 추가

my_list.extend(my_list_2)
print(my_list)
[1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 11, 3, 5, 7, 9, 8, 4, 6, 2, 10]

index(x)

입력된 인자의 위치 반환

print(my_list.index(1))
0

insert(x,y)

x자리에 y를 입력해줌

my_list.insert(0,30)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 11, 3, 5, 7, 9, 8, 4, 6, 2, 10]

pop(x)

입력된 값을 빼줌

my_list.pop(11)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 3, 5, 7, 9, 8, 4, 6, 2, 10]

()안에 입력을 하지 않으면 마지막 값을 지운다

my_list.pop()
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 10, 3, 5, 7, 9, 8, 4, 6, 2]

remove(x)

입력된 값을 빼줌

my_list.remove(10)
print(my_list)
[30, 1, 3, 5, 7, 9, 8, 4, 6, 2, 3, 5, 7, 9, 8, 4, 6, 2]

값이 없으면 에러를 일으킨다

my_list.remove(100)
print(my_list)
my_list.remove(100)
ValueError: list.remove(x): x not in list

sort()

리스트를 정렬해준다

my_list.sort()
print(my_list)
[1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 30]

리스트가 문자열로 이루어진 경우

my_list_3 = ['1', '2', '3', '5', '10', '11', '12', '22', '33', '34']
my_list_3.sort()
print(my_list_3)
['1', '10', '11', '12', '2', '22', '3', '33', '34', '5']

reverse()

리스트를 뒤집어서 출력해준다

my_list.reverse()
print(my_list)
[30, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1]

clear()

리스트 항목 삭제(리스트 자체를 삭제하는건 아니다)

my_list.clear()
print(my_list)
[]

 

복습복습

반응형
반응형

python으로 369게임 만들어보기

숫자를 입력하면 369 게임 결과가 문자열로 출력되도록 만들어보았다

n = int(input())
game_list = ''
fin = ''

for i in range(1, n+1):
    game_list += (str(i)+' ')
    game = game_list.split(' ')
for i in range(0, n):
    if '3' in game[i] or '6' in game[i] or '9' in game[i]:
        game[i] = '짝'
game.pop(-1)
for i in range(0, n):
    fin += game[i] + ' '
print(fin)

'3' '6' '9'가 문자열에 속하면 짝을 출력하게 만들었다

 

문자열로 출력을 하려고 어찌저찌 하다보니깐 상당히 비효율적인 코드가 만들어졌다.

 

일단 int 로 숫자를 받아서 -> 받은 숫자의 길이만큼 생성되는 리스트를 만들어주고 -> split를 이용해서 만들어진 리스트를 띄어쓰기를 기준으로 문자열로 다시 바꿔준 후 -> 만들어진 리스트를 돌며 '3' '6' '9' 가 속해있다면 짝으로 변경해준다

띄어쓰기를 기준으로 문자열로 바꿔주는 과정에서 공백문자 하나가 리스트에 추가가 되어서 .pop()을 이용해 가장 마지막에 있는 공백 리스트를 제거해 준 후 -> 다시 for 문을 동해 3,6,9가 짝으로 바뀐 문자열을 돌아 문자열에 추가해준다

그리고 문자열 출력

 

 

형변환 과정만 몇번을 거쳐야하는 매우 비효율 적인 코드 완성...

생각해보니... 33 36 39 같이 369가 2개가 중첩되는 구간은 '짝' 이 아니라 '짝짝'이 출력되게 해야하네...

그런식으로 코드를 짜려면 코드를 살짝 수정하는게 아니라 전반적인 풀이 방법을 아예 바꿔야 할 것 같다

 

 

 

반응형
반응형

재귀함수

함수 안에서 자기 자신을 호출하는 함수

오늘의 연습 재귀함수로 팩토리얼 계산하는 함수 만들기 +for문을 활용한 팩토리얼 계산

최종코드

# 재귀함수 연습 01 팩토리얼 계산해보기

# 재귀함수를 이용한 팩토리얼 계산 함수
def fac (num):
    gap = num
    if num <= 1:
        return gap
    else:
        gap = gap * fac(num-1)
        return gap

# 반복문으로 팩토리얼 계산
def fac_for (num):
    gap = 1
    for i in range(num):
        gap += gap * i
    return gap

factorial = int(input())

print(fac(factorial))
print(fac_for(factorial))

일단 재귀함수를 연습하기 좋다는 팩토리얼 계산 법을 만들어봤는데...!

내가 짠 코드대로라면 일단 for문의 코드 줄이 조금 더 짧다!

아직 반복문에 더 익숙해져 있다보니 반복문으로 짜는게 더 쉽기도 하고... 하지만 연습을 위해 재귀함수를 다른 경우에도 사용해서 코드를 만들어봐야할 것 같다

문제에 따라 재귀함수가 더 효율적일 수 있고, 반복문을 사용하는게 더 효율적일 수도 있다

if num <= 1:
return gap

base case

재귀함수에는 반드시 함수를 빠져나갈 수 있는 base case가 존재해야한다 base case가 존재하지 않으면 무한반복에 걸린다...! 여기서 나는

if num <= 1:

    return gap

으로 받은 숫자에서 계속 1씩 작아지며 연산하다가 결국 값이 1이 되는 순간 함수를 빠져나가도록 했다

해당 함수에서 '<'는 필요 없지만 혹시 내가 낼지도 모르는 오류를 대비해서 '<'를 입력해뒀다 <= >= 가 습관이기도 하구,,,ㅎㅎ

반응형

'study > python' 카테고리의 다른 글

python) list append() 와 extend() 비교하기  (0) 2021.08.01
python) list에서 사용할 수 있는 메서드 정리  (0) 2021.08.01
python) 369 게임 만들어보기  (0) 2021.07.29
python) any()함수  (0) 2021.07.26
python) min / max 함수  (0) 2021.07.26

+ Recent posts