본문 바로가기

자료구조/자료형

List - Python, Dart, Golang(배열/슬라이스)

Python

 

추가 - append, insert

 

append
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]

>>> a.append([5,6])
>>> a
[1, 2, 3, 4, [5, 6]]

extend
>>> a = [1,2,3]
>>> a.extend([4,5])
>>> a
[1, 2, 3, 4, 5]
>>> b = [6, 7]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6, 7]

insert
0번째 자리, 즉 첫 번째 요소(a[0]) 위치에 값 4를 삽입하라는 뜻이다.
>>> a = [1, 2, 3]
>>> a.insert(0, 4)
>>> a
[4, 1, 2, 3]

리스트 a의 a[3], 즉 네 번째 요소 위치에 값 5를 삽입
>>> a.insert(3, 5)
>>> a
[4, 1, 2, 5, 3]

 

수정

 

>>> a = [1, 2, 3]
>>> a[2] = 4
>>> a
[1, 2, 4]

 

삭제 - del(index), remove(value), pop(index)

remove - count 로 확인후 사용

del, pop - len 확인후 사용

 

del
>>> a = [1, 2, 3]
>>> del a[1]
>>> a
[1, 3]

>>> a = [1, 2, 3, 4, 5]
>>> del a[2:]
>>> a
[1, 2]

remove
remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.

>>> a = [1, 2, 3, 1, 2, 3]
>>> a.remove(3)
>>> a
[1, 2, 1, 2, 3]
a가 3이라는 값을 2개 가지고 있을 경우 첫 번째 3만 제거되는 것을 알 수 있다.

>>> a.remove(3)
>>> a
[1, 2, 1, 2]
remove(3)을 한 번 더 실행하면 다시 3이 삭제된다.

pop
pop()은 리스트의 맨 마지막 요소를 돌려주고 그 요소는 삭제한다.

>>> a = [1,2,3]
>>> a.pop()
3
>>> a
[1, 2]

pop(x)는 리스트의 x번째 요소를 돌려주고 그 요소는 삭제한다.

>>> a = [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]

 

그외

 

index
index(x) 함수는 리스트에 x 값이 있으면 x의 위치 값을 돌려준다.

>>> a = [1,2,3]
>>> a.index(3)
2
>>> a.index(1)
0
위 예에서 리스트 a에 있는 숫자 3의 위치는 a[2]이므로 2를 돌려주고, 
숫자 1의 위치는 a[0]이므로 0을 돌려준다.

다음 예에서 값 0은 a 리스트에 존재하지 않기 때문에 값 오류(ValueError)가 발생한다.

>>> a.index(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 0 is not in list


count
count(x)는 리스트 안에 x가 몇 개 있는지 조사하여 그 개수를 돌려주는 함수이다.

>>> a = [1,2,3,1]
>>> a.count(1)
2

 

 

 

Dart

 

선언

 

my_list는 크기 3짜리인 리스트인데, 이 리스트는 안 쓴다고 줄어들지 않고 더 쓰겠다고 늘어나지도 않는다. 
0번부터 2번까지 쓸 수 있다.

var my_list = new List(3);	// 크기 3짜리 리스트를 만듦
var your_list = List<int>.filled(5, 0);	// 모든 원소가 0으로 초기화된 크기 5짜리 리스트를 만듦

 
가변 리스트는 런타임 동작 시 길이를 바꿀 수 있다. 
자유롭게 길이를 정할 수 있는 리스트를 만들려면 다음과 같이 선언하면 된다.

var my_list2 = [1, 2, 3];	// 값과 함께 리스트를 초기화함
var my_list3 = new List();	// 길이가 0인 리스트를 만듦
var my_list4 = new List.empty(growable: true);
var my_list5 = List<int>.filled(5, 0, growable: true);

 

추가

 

하나의 값을 리스트 맨 마지막에 추가할 때는 add, 
여러 개의 값을 한 번에 추가하려면 리스트에 담아 addAll 하면 된다.
my_list.addAll([6, 7, 8]);
my_list.add(9);

특정 위치에 원소를 삽입하고 싶다면 insert를 쓰면 된다. 
insert()는 첫 번째에 인덱스, 두 번째에 삽입할 데이터를 써 준다. 
insertAll을 해서 한 번에 여러 데이터를 삽입할 수도 있다.
my_list.insert(3, 3);
my_list.insertAll(1, [1, 2]);

 

수정

 

var my_list = List<int>.filled(5, 0, growable: true);
my_list[0] = 1;
my_list[4] = 5;
print(my_list[2]);	    // 0
print(my_list.first);	// 1
print(my_list.last);	// 5

 

삭제

 

var my_list2 = [1, 2, 3, 4, 5];

value로 삭제
remove는 bool 타입을 반환하는데, 해당하는 값이 있었고 잘 지워졌다면 true, 
그렇지 않다면 false를 반환한다. 
my_list.remove(0);	//제일 먼저 등장하는 1 삭제

index로 삭제
그 다음 n번 인덱스의 원소 값이 무엇이든 그 인덱스 값을 지우고 싶다면 removeAt을 사용하면 된다. 
removeAt은 지운 인덱스의 원소를 반환한다.
my_list.removeAt(3);	// 3번 인덱스의 값(4)을 지운다.


마지막 원소를 지우고 싶다면 removeLast()를 쓸 수 있다. pop과 같은 연산이다. 
removeLast 역시 방금 지운 원소를 반환한다.
my_list.removeLast();

어느 범위 사이의 원소를 삭제하고 싶을 수도 있다. 그럴 때는 removeRange를 사용할 수 있다. 
removeRange는 start와 end 인덱스를 받아 start, end 사이의 원소를 모두 삭제한다. 
아무것도 반환하지 않는다.
1번부터 3번 인덱스 전까지, 즉 1번과 2번 2개의 원소를 삭제한다.
my_list.removeRange(1, 3);

리스트의 전체 원소를 삭제하고 싶다면 clear()를 사용하면 된다. 
리스트 안의 원소가 지워져 리스트는 길이가 0이 된다.
my_list.clear();

 

검색

 

리스트가 어떤 원소를 갖고 있는지 확인하고 싶다면, contains 메소드를 쓸 수 있다. 
contains(value)를 하면 value가 들어있을 때 true, 그렇지 않을 때 false를 반환한다.
my_list5.contains(0);	//true
 

리스트 안에 있는 원소 중 어떤 하나라도 주어진 조건을 만족하는지 알고 싶다면 any를 쓸 수 있다. 
다음의 코드는 my_list의 원소 중 5가 넘는 값이 하나라도 있는지 확인하는 문장이다. 
이와 같이 any 안에 bool 타입을 반환하는 함수를 써서 구현할 수 있다. every도 마찬가지다. 
특이한 건 함수 안의 매개변수가 하나라도 반드시 괄호 ()로 감싸줘야 한다는 사실이다.


print(my_list5.any((x) => x > 5));
print(my_list5.every((x) => x < 6));


어떤 원소가 여러 개 있는 것 같을 때, 가장 왼쪽에 있는 값을 찾을 때는 indexOf를 쓸 수 있다. 
해당 원소를 가진 제일 처음 나오는 인덱스 번호가 반환된다.
my_list5.indexOf(0);


마찬가지로 뒤에서부터 찾고 싶을 때는 lastIndexOf를 쓸 수 있다.
my_list5.lastIndexOf(0);

 

 

Golang(배열/슬라이스)

 

배열(고정길이)

 

  package main
  
  import "fmt"
  
  func main() {
      var arr_int [5]int
      fmt.Println(arr_int)
      fmt.Println(len(arr_int))
  }
  
출력 결과는 다음과 같다.

[0 0 0 0 0]
5


package main

import "fmt"

func main() {
    var arr_int [5]int
    for i := 0; i < len(arr_int); i++ {
        arr_int[i] = i
    }
    fmt.Println(arr_int[0])
}

결과는 다음과 같다.
0


 package main
 
 import "fmt"
 
 func main() {
     arr_int := [5]int{0, 1, 2, 3, 4}
 
     for data := range arr_int {
         fmt.Println(data)
     }
 }

 

슬라이스(가변길이)

 

package main
 
import "fmt"
  
func main() {
    arr_int := []int{0, 0, 0, 0, 0}
    arr_int := make([]int, 5)
  
    fmt.Println(arr_int)
}
  
package main
  
import "fmt"
  
func main() {
    arr_int := make([]int, 5, 10)
    x := arr_int[0:10]
  
    fmt.Println(arr_int)
    fmt.Println(x)
}

 

추가 - 슬라이스만 추가 가능 / 배열은 추가 불가능

 

func main() {
    arr_int := []int{1, 2, 3, 4, 5}

    x := make([]int, 10)
    y := make([]int, 3)

    fmt.Println("x before copy: ", x)
    fmt.Println("y before copy: ", y)

    copy(x, arr_int)
    copy(y, arr_int)

    fmt.Println()
    fmt.Println("x after copy: ", x)
    fmt.Println("y after copy: ", y)
}


---------- 결과 ----------

x before copy:  [0 0 0 0 0 0 0 0 0 0]
y before copy:  [0 0 0]

x after copy:  [1 2 3 4 5 0 0 0 0 0]
y after copy:  [1 2 3]

 

 

 

 

 

 

'자료구조 > 자료형' 카테고리의 다른 글

[Python] 깊은복사(copy 와 deepcopy)  (0) 2023.02.27
[Flutter] Collection , Generic  (0) 2022.04.14
Map/Dict - Python, Dart, Golang  (0) 2021.11.30