python list deepcopy, 형변환
리스트(List) 팁
- list.append( x ) : 리스트의 마지막에 x 추가
- list.sort() : 리스트 정렬
- list.reverse() : 리스트 뒤집기
- list.index( x ) : x가 있는 인덱스를 표시
- list.remove( x ) : 리스트에서 제일 처음 나온는 x를 제거
- list.pop() : 리스트의 맨 마지막 요소를 반환하고 제거
- list.pop( i ) : 리스트의 i 번째를 반환하고 제거
- list.count() : 리스트의 아이템 개수를 반환
- list.count( x ) : 리스트에 존재하는 x의 개수를 반환
- list.extend( x ) : 리스트의 끝에 x를 확장
b=[ [1,2], [3,4] ]
a.append( b[1] )
이렇게 했을 경우 b 나 a의 값이 바뀌면 두개다 바뀌게 되는데
deepcopy 로 구현하려면 어떻게 해야하나요?
import copy
copy.deepcopy
로 하는거 말고요
리스트에서 하나씩 옮길경우 딥카피 하는 방법을 좀 알려주세요~
--------------------------------------------------------------
>>> a = []
>>> b = [[1, 2], [3, 4]]
>>> a.append(b[1][:])
>>> a
[[3, 4]]
>>> a[0][0] = 9
>>> a
[[9, 4]]
>>> b
[[1, 2], [3, 4]]
1. 객체의 복사 : 같은 값을 가지는 객체를 하나 혹은 그 이상 만드는 것
1) copy 모듈을 이용한 객체 복사
- 얕은 복사(Shallow Copy) : 복합 객체를 별도로 생성하되 내용은 원래의 레퍼런스로 채운다.
>>> a = [1, 2, 3]
>>> b = [4, 5, a]
>>> x = [a, b, 100]
>>> y = copy.copy(x)
- 깊은 복사(Deep Copy) : 복합 객체를 생성하고 내용을 재귀적(Recursive)으로 복사한다.
>>> a = [1, 2, 3]
>>> b = [4, 5, a]
>>> x = [a, b, 100]
>>> y = copy.deepcopy(x)
2. 형 변환
1) 수치 형 변환
- 정수형 변환 : int()
※ 실수→정수 : int(), round(), floor(), ceil()
- 실수, 롱형으로의 형 변환 : float(), long()
- 복소수로의 형 변환 : complex()
2) 시퀀스 자료형 변환
- 리스트로 변환 : list()
- 튜플로 변환 : tuple()
>>> l = [5, 6, 7, 8]
>>> s = 'abcd'
>>>
>>> print list(t), list(s)
[1, 2, 3, 4] ['a', 'b', 'c', 'd']
>>> print tuple(l), tuple(s)
(5, 6, 7, 8) ('a', 'b', 'c', 'd')
3) 문자열로의 형 변환
- 비형식적인 문자열로 변환 : str()
- 형식적인 문자열로 변환 : repr()
- `obj` : repr(obj)와 동일
※ 객체 ↔ 문자열 : repr(str은 완벽한 변환 안됨), eval 사용
>>> L = ['파란 하늘', 'blue sky', 1, 1234L, 1/3.0]
>>> for s in L:
print 's', s
print 'str(s)', str(s)
print 'repr(s)', repr(s)
print '\'s\'', `s`
print
s 파란 하늘
str(s) 파란 하늘
repr(s) '\xc6\xc4\xb6\xf5 \xc7\xcf\xb4\xc3'
's' '\xc6\xc4\xb6\xf5 \xc7\xcf\xb4\xc3'
s blue sky
str(s) blue sky
repr(s) 'blue sky'
's' 'blue sky'
s 1
str(s) 1
repr(s) 1
's' 1
s 1234
str(s) 1234
repr(s) 1234L
's' 1234L
s 0.333333333333
str(s) 0.333333333333
repr(s) 0.33333333333333331
's' 0.33333333333333331
4) 문자열 요소를 가지는 리스트나 튜플을 문자열로 변환
>>> s = 'Python is the first language'
>>> L = s.split()
>>> L
['Python', 'is', 'the', 'first', 'language']
>>> ' '.join(L)
'Python is the first language'
- 사전에서 리스트로 변환
>>> d.keys()
[1, 2, 3]
>>> d.values()
['one', 'two', 'three']
>>> d.items()
[(1, 'one'), (2, 'two'), (3, 'three')]
>>> values = [1, 2, 3, 4]
>>> L = zip(keys, values)
>>> L
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> dict(L)
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
'a'
>>> ord('a') # 문자 → 아스키 코드
97
100
>>> int('144', 8) # 8진수 '144'를 10진수로
100
>>> int('101111', 2) # 2진수 '101111'을 10진수로
47
>>> int('14', 5) # 5진수 '14'를 10진수로
9
- 10진수에서 8, 16진수로
'0x64'
>>> oct(100) # 10진수 100을 8진수 문자열로 변환
'0144'
- 10 진수에서 2진수로
## 10진수 → 2진수
# @file int2bin1.py
octtab = {'0': '000', '1': '001', '2': '010', '3': '011',
'4': '100', '5': '101', '6': '110', '7': '111'}
def bin1(d, width=0):
"integer to binary(string)"
s = "%o" % d
b = ''
for el in s:
b += octtab[el]
if width > 0:
if len(s) > width:
return b[:width]
b = b.zfill(width)
return b
print bin1(23, 7) # 0010111
# @file int2bin2.py
def bin2(n, width=0):
result = []
while 1:
result[:0] = [str(n&1)]
n >>= 1
if not n:
break
results = ''.join(result)
if not width:
width = len(results)
return results.zfill(width)[:width]
print bin2(23, 7) # 0010111
- 10진수에서 임의의 진수로
## 10진수 → 임의의 진수
# @param n 10진수
# @param base 변환할 진수
# @param width 출력 문자열 폭. 0이면 기본 값
def int2digit(n, base, width=0):
res = ''
while n > 0:
n, r = divmod(n, base)
if r > 9:
r = chr(ord('a')+r-10)
res += str(r)
if not res:
res = '0'
if not width:
width = len(res)
return res.zfill(width)[:width]
print int2digit(70, 5) # 240
print int2digit(70, 12) # 5a
print int2digit(70, 15) # 4a
print int2digit(70, 16) # 46
print int2digit(70, 2, 8) # 01000110
9) 정수를 콤마가 있는 문자열로 변환
>>> locale.setlocale(locale.LC_ALL, "") # 사용자 기본 환경(국가 혹은 언어)으로 설정
'Korean_Korea.949'
>>> print locale.format("%d", 10030405, 1)
10,030,405
'Python' 카테고리의 다른 글
운영체제 과제 프로세스 스케쥴링 시뮬레이션 (2) | 2008.05.12 |
---|---|
Python 무한루프 만들기 (0) | 2008.05.04 |
Python 에서 goto 쓰기 (0) | 2008.05.03 |