김두두의 블로그
파이썬-비트 반전하기 본문
이 블로그는 제가 시행착오를 겪은 것에 대한 블로그입니다!
정확한 코딩이 아닐 수도 있습니다.
a=[1,0,0,0,1,....] 의 list와 b=[0,0,0,0,...1]의 list 가 있다고 하자.
둘을 merge하거나 둘 중 하나를 반전 시킨 list c를 구하고 싶다.
리스트 크기가 큰 걸 시도하기 전에, 쉬운 예시로 해보자.
a=[1,0,0]
b=[1,1,1] 의 두 list가 있다하자.
오류 1)
>>> c=a^b
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
c=a^b
TypeError: unsupported operand type(s) for ^: 'list' and 'list'
먼저 c가 뭔지 지정해줘야 한다. 그냥 c=a^b로 구하는 것은 안된다. 더욱이 비트 연산자는 list 통째로는 연산이 안되는 듯 하다.
오류2)
>>> c=[]
>>> for i in range(1,4):
c[i]=a[i]^b[i]
Traceback (most recent call last):
File "<pyshell#13>", line 2, in <module>
c[i]=a[i]^b[i]
IndexError: list assignment index out of range
파이썬 수업 들을 때 어렴풋이 range 쓸 때 (1,n)을 쓰면 1부터 n-1까지라는 기억이 나서 for 문을 적어주었다. ->틀릴 수도 있음: 추후 확인.
난 range를 잘못써서 계속 오류가 나는 줄 알았다.
그런데 구글링해보니 list assignment index out of range는 빈 리스트일 때 많이 일어나는 것 같다. 빈 리스트인데 어떻게 i 번째의 index를 정해줄 수 있냐 이 말인 것 같다. 그럴 듯 하다.
>>> c=[0]*3
>>> c
[0, 0, 0]
그래서 먼저 c를 크기 3인 0으로만 이루어진 리스트로 만들어 주었다.
만약 a, b의 리스트 크기가 크다면 len()를 통해 리스트의 크기를 알 수 있다.
>>> for i in range(1,3):
c[i]=a[i]^b[i]
>>> c
[0, 1, 1]
그랬더니 잘 실행되었다.
근데 과연 이 값이 내가 원하는 c 값이 맞을 지 확인해 볼 필요가 있다.
^ 연산자는 XOR을 뜻한다. 즉, 두 값이 같으면 0, 두 값이 다르면 1이다.
^ | 0 | 1 |
(=XOR) | 두 값이 같을 때 | 두 값이 다를 때 |
처음에 a=[1,0,0], b=[1,1,1]로 뒀으므로 ^연산자를 하면 XOR의 정의에 의해 [0,1,1]이 나올 것이고 이는 c와 같다.
성공했다!
반전은 뇌를 좀 식히고 생각해봐야겠다..
머리를 좀 식혔다
>>> a=[1,0,0]
>>> d=not(a)
>>> d
False
역시 그냥 이렇게 하는 건 답이 아닌 것 같다.
>>> d=[0]*3
>>> d
[0, 0, 0]
>>> for i in range(0,2):
d[i]=not a[i]
>>> d
[False, True, 0]
이게 왜이러는 지 모르겠다...라고 치는 순간 생각났다. 또 range문제다...하 진짜 R쓰다가 파이썬 쓰니까 숫자 감각이 사라진 것 같다. 파이썬은 왜 이렇게 index를 설정한건지 참 하여튼 다시 d에 0들을 채워줬다.
>>> d=[0]*3
>>> for i in range(0,3):
d[i]=not a[i]
>>> d
[False, True, True]
range를 (0,2)에서 (0,3)으로 바꿔주니 일단 d가 뭔가 나오긴 했다.
근데 솔직히 이 반전 문제는 not 연산자 사용하는 것(이렇게 쓸 수 있을지도 의문이긴 하다..)보다 if 조건문 쓰는 게 더 나을 것 같다. 그래서 if 를 쓰기로 했다.
>>> d=[0]*3
>>> for i in range(0,3):
if a[i]==1:
d[i]==0
else:
d[i]==1
True
False
False
>>> d
[0, 0, 0]
생각해보니 ==로 적어줘서 오류가 났다.
>>> for i in range(0,3):
if a[i]==0:
d[i]=1
else:
d[i]=0
>>> d
[0, 1, 1]
잘 구해졌다. 끝
*가끔씩은 쉽게 돌아가려기보다는 정공법이 통하는 것 같다.
(음..이건 쉬운 문제였긴 하지만)
'it' 카테고리의 다른 글
R-What is boosting.cv? (0) | 2021.05.15 |
---|---|
R-adaboost 중 error: Error in `[.data.frame`(data, , as.character(formula[[2]])) (0) | 2021.05.15 |
R-bagging함수 (데이터프레임) (0) | 2021.05.15 |
HTML-sublime text 설치하고 간단히 만들어보기 (0) | 2021.05.15 |
파이썬-list안의 list (0) | 2021.05.12 |