Python의 list를 다룰 때 특히 list의 특정 항목을 다른 항목으로 치환하고자 할 때 사용하는 slice에서 자칫 잘못하면

원래의 list 항목을 날려 먹거나 원치 않는 value가 끼워넣어지는 문제가 발생한다.

그래서 list의 length가 원치 않게 변해 버리는 문제가 발생한다.

아래 코드가 전형적으로 이런 문제를 유발하는 예제이다.


#-*- coding: utf-8 -*-

a = []

b = [101, 102, 103, 104, 105]

for i in range(10):

   a.insert(i, i)


print("원본", a)

print('길이', len(a))


#아래 코드는 index 2~4까지를 바꾼다. 총3개를 바꾼다.

#그런데 list b에 있는 값은 5개이다. 따라서 b의 앞 3개는

#치환이 되지만 나머지 2개(104, 105)는 끼워넣기가 되어 버린다.

#따라서 list a가 원래 10개였는데 아래 코드 실행 후 len()은 12개가 된다

#a[2:5] = b[0:] 

#print(a)

#print("길이", len(a)) #12가 나온다


#아래 코드는 index 1~7까지 총 7개를 바꾸는데 바꿀 내용인 

#list b에는 값이 5개 뿐이다(101 ~ 105). 이럴 경우 발생하는 현상은

#list a의 index 1~5까지는 101~105로 각각 치환이 되고 

#list a에서 나머지 index 6~7에 해당하는 값은 사라져 버린다.

#그래서 아래 코드 실행후 list a의 len()은 8이 되어져 버린다.

#a[1:8] = b[0:] #이 코드를 실행하고자 하면 위 a[2:5] = b[0:]를 주석 처리 할 것

#print(a)

#print("길이", len(a)) #8이 나온다.


#이러한 문제를 해결하기 위해서는 다음과 같이 처리해 주어야 안전하다.

a[1:len(b)+1] = b[0:]

print(a)

print("길이", len(a))





Map과 List에 대한 간단한 이해


List는 원소들을 가지고 있는 데이터 집합이다. 순차 자료구조로 순차적으로 메모리에 저장되는 형태이다. 쉽게 배열로 바꾸어서 생각해도 된다. 

따라서 List의 원소에 접근할 때는 index(첨자)로 접근한다.


List는 Generic이라는 옵션이 존재하는데 Generic 옵션이 설정된 List는 Generic에 해당되는 데이터 형만을 담을 수 있다.


List<Integer> myList = new ArrayList<Integer>();


위와 같이 선언된 List는 Generic 옵션으로 Integer 형을 받았다.

myList에 add할 수 있는 자료들은 Integer형의 데이터만 담을 수 있게 된다.


myList.add("data")와 같이 문자열을 넣으려 한다면 에러가 발생하게 된다.


myList.get(i)과 myList.remove(i) 메소드를 사용해서 myList 안에 있는 원소들을 인텍스로 접근, 삭제 등을 할수 있다.


Map은 List와 같은 원소들을 모아 놓은 집합이다.

List와는 달리 index(첨자)로 접근하는 것이 아니라 key로써 데이터를 제어할수 있다.

Map 또한 Generic 옵션을 설정할 수 있다.


Map<String, Object> myMap = new HashMap<String, Object>();

와 같이 Generic을 key와 data형으로 지정한다.


myMap.put("elementA", "Data_1");

과 같은 형태로 String의 key로 myMap에 저장된 Object 데이타를 제어할 수 있게 되며 Generic 형식에 따라야 한다.


put으로 저장된 데이터는 put할 때 지정했던 key로 접근이 가능하며

myMap.get("elementA")을 호출하면 저장된 "Data_1"이 반환된다.

myMap.remove("elementA")을 호출하면 해당하는 key를 가진 원소가 삭제된다.




+ Recent posts