수업/정리

220518 파이썬 문법7 - 리스트 함수, 튜플, set

jumphare 2022. 5. 18. 22:25

###리스트
※numpy 라이브러리 설치하기
numpy : 배열 만들어주는 모듈... 데이터 분석할 때 필수적으로 사용함
file-settings - 좌측에서 Python Interperter - 새 라이브러리 추가하기 위해 + 누른다
- numpy 검색 - install package (원하는 버전을 설치하고 싶으면 Specify version 체크하고 고르면 됨)

import numpy as np : np라는 별칭을 부여해 numpy 라이브러리를 임포트한다
s3 = [[1,2,3],[4,5,6],[7,8,8]] # 이중 리스트
    
a1 = np.array(s3) # 배열로 저장

print(s3)    # 결과 : [[1, 2, 3], [4, 5, 6], [7, 8, 8]]
print(a1)
# 결과
[[1 2 3]
 [4 5 6]
 [7 8 8]]


### 리스트 함수
#  + (합침)
data1 = ['a','b','c','d','e']
data2 = ['f','g','h','i','j']
result1 = data1 + data2
result2 = data2 + data1

print('result1:', result1)          # ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
print('result2:', result2)          # ['f', 'g', 'h', 'i', 'j', 'a', 'b', 'c', 'd', 'e']

#  * (반복)
listdata = list(range(3))           # [0, 1, 2]
result = listdata * 3               # listdata를 3번 반복한 리스트
print('result:', result)            # [0, 1, 2, 0, 1, 2, 0, 1, 2]

# sum() : 리스트의 모든 원소들의 합을 구해주는 함수
list1 = [2,2,1,3,8,5,7,6,3,6,2,3,9,4,4]
list2 = list(range(1,11))           # 1 ~ 10
result1 = sum(list1)   # 65
result2 = sum(list2)   # 55

# len() : 리스트에 있는 모든 원소의 개수(길이)를 구해주는 함수
listdata = [2,2,1,3,8,5,7,6,3,6,2,3,9,4,4]
length = len(listdata)   # 15

# append() : 리스트에 새로운 원소를 추가할 때 사용되는 함수
a = [1, 2, 3]
a.append(4)                 # 4 추가 : [1, 2, 3, 4]
a.append([5, 6])            # [5, 6] 추가 : [1, 2, 3, 4, [5, 6]]

# remove() : 리스트의 특정 원소를 삭제하는 함수
 형식 : remove('삭제할 데이터')
a = [1, 2, 3, 1, 2, 3]
a.remove(3)                 # 첫번째로 나오는 3을 삭제 : [1, 2, 1, 2, 3]
a.remove(3)                 # (첫번째 없앴으니) 두번째로 나오는 3을 삭제 : [1, 2, 1, 2]

# del 명령 : 리스트의 특정 원소를 'index번호로' 삭제하는 명령
 형식 :  del  리스트[ index 번호 ]
a = [1, 2, 3]
del a[1]                    # 인덱스 1번 원소 삭제 : [1, 3]

b = [1, 2, 3, 4, 5]
del b[2:]                   # 인덱스 2번 원소부터 끝까지 삭제 : [1, 2]

del b                       # 리스트 b를 메모리 상에서 삭제
print(b)                    # NameError: name 'b' is not defined

# insert() : 리스트의 특정 위치에 원소를 삽입할때 사용되는 함수
 insert( 인덱스 번호, 데이터 )
a = [1, 2, 3]
a.insert(0, 4)     # # 인덱스 0번 위치에 4를 삽입 : [4, 1, 2, 3]

#  index() : 리스트에서 특정 원소의 인덱스 번호를 구해주는 함수
solarsys = ['태양','수성','금성','지구','화성','목성','토성','천왕성','해왕성','지구']
planet = '지구'

pos = solarsys.index(planet)    # # 가장 먼저 나오는 '지구'의 인덱스 번호 : 3
* 찾는 원소가 없는 경우에는 오류 발생
   # pos = solarsys.index('명왕성')

# pop() : 리스트의 마지막 원소를 삭제하고 리턴하는 함수
 pop( 인덱스 번호 ) : 인덱스 번호의 원소를 삭제하고 리턴
list = [10, 20, 30, 40, 50]
data1 = list.pop()              # 마지막 원소인 50을 삭제하고 50을 data1에 리턴
print('data1:', data1)          # 50
print('list:', list)            # [10, 20, 30, 40] -- 50 제외한 나머지만 들어있음

data2 = list.pop(2)             # 인덱스 2번 원소(30)를 삭제하고 data2에 리턴
print('data2:', data2)          # 30
print('list:', list)            # [10, 20, 40] -- 30 제외한 나머지만 들어있음

# reverse() : 리스트의 원소의 순서를 역순으로 바꾸어 주는 함수
 형식 : 리스트.reverse()
 reverse() 함수는 원본 리스트 자체를 변경한다.
listdata = list(range(10))          #  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
listdata.reverse()                  # listdata 역순으로 변경 : [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
--> reverse 시킨 이후로는 listdata가 역정렬된 상태로 저장된다!


# sort() : 리스트에 있는 원소를 오름차순으로 정렬해주는 함수
 형식 :  리스트.sort()
1 오름차순 정렬(1,2,3) : 리스트.sort()
2 내림차순 정렬(3,2,1) : 리스트.sort( reverse = True)
3 sort() 함수를 이용해서 정렬을 하면 원본 리스트가 변경된다.

namelist = ['Mary','Sams','Aimy','Tom','Michale','Bob','Kelly']
namelist.sort()     # 오름차순 정렬 : ['Aimy', 'Bob', 'Kelly', 'Mary', 'Michale', 'Sams', 'Tom']
namelist.sort(reverse=True)    # 내림차순 정렬 : # ['Tom', 'Sams', 'Michale', 'Mary', 'Kelly', 'Bob', 'Aimy']

# sorted() : 리스트에 있는 원소를 오름차순으로 정렬해주는 함수
 형식 : sorted( 리스트 )     (sort랑 형식이 다르다!)
1 오름차순 정렬 : sorted( 리스트 )
2 내림차순 정렬 : sorted( 리스트, reverse = True )
3 sorted() 함수를 이용해서 정렬을 해도 원본 리스트가 변경되지 않는다.
result1 = sorted(namelist)    # 이런 식으로 원본데이터를 변경한 것을 다른 데이터에 저장하는 방식으로 사용 (원본데이터를 건드리지 않음)

ex. [1, 3, 5, 4, 2] 라는 리스트를 [5, 4, 3, 2, 1]로 변경 하세요?
list = [1, 3, 5, 4, 2]

1. sort()
list.sort(reverse=True)                 # 내림차순 정렬

2. sort(), reverse()
list.sort()                             # 오름차순 정렬
list.reverse()                          # 역순으로 정렬

3. sorted()
list2 = sorted(list, reverse=True)      # 내림차순 정렬
print('list2:', list2)

4. sorted(), reverse()
list3 = sorted(list)                    # 오름차순 정렬
list3.reverse()                         # 역순으로 정렬


----------------------------
### 튜플
1. 순차적인 자료구조이다.
 2. 튜플 데이터는 괄호() 안에 데이터를 저장한다.
 3. 튜플 데이터는 수정 할 수 없다.
 4. 튜플은 여러가지 자료형의 데이터를 혼용해서 저장할 수 있다.

t1 = ()                         # 비어있는 튜플 : ()
t2 = (1,)                   # (1,)
t3 = (1,2,3)               # (1,2,3)
t4 = 1, 2, 3               # (1,2,3) : 괄호 없어도 여러 값을 저장하면 튜플이 됨
t5 = (30, 3.14, True, False, 'python')
# t5[1] = 42.195               # 오류 발생 : 튜플데이터는 수정할 수 없다.
# TypeError: 'tuple' object does not support item assignment 이런 오류~
t6 = ('a', 'b', 'c', ('ab', 'cd'))   # 중첩 튜플 가능!

# 1.튜플의 인덱싱
t1 = (1, 2, 'a', 'b')
print(t1[0])                        # 1

# 2. 튜플의 슬라이싱
 [ start index : end index ] (end 미만까지~)
t2 = (10, 20, 30, 40, 50)
print(t2[1:3])                      # 인덱스 1~2번까지 슬라이싱  : (20, 30)

# 3. 튜플 더하기 : +
print(t1 + t2)                      # (1, 2, 'a', 'b', 10, 20, 30, 40, 50)
print(t2 + t1)                      # (10, 20, 30, 40, 50, 1, 2, 'a', 'b')

# 4. 튜플 곱하기 : * (반복)
print(t2 * 3)                       # (10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50)


# 튜플의 함수
# 1. len() : 튜플 원소의 갯수를 구해주는 함수
t1 = (10, 20, 30, 40, 50)
print(len(t1))                      # 튜플 원소의 갯수 : 5
print(t1)                           # (10, 20, 30, 40, 50)

# 2. count() : 튜플의 특정 원소의 갯수를 구해주는 함수
t2 = (1,100,2,100,3,100,4,100,5,100)
print(t2.count(100))                # 튜플의 원소 100의 갯수 : 5

# 3. index() : 튜플의 특정 원소의 인덱스 번호를 구해주는 함수
t3 = ('java','jsp','python','spring','R','tensorflow','keras')
print(t3.index('spring'))          # spring 원소의 인덱스 번호 : 3


# 튜플 패킹(tuple packing) : 여러 데이터를 튜플로 묶는 것
t1 = 10, 20, 30
print(type(t1))                     # <class 'tuple'>

# 튜플 언패킹(tuple unpacking)
 1. 튜플의 각 원소를 여러개의 변수에 할당하는 것
 2. 튜플의 원소의 갯수와 변수 갯수가 일치되지 않으면 에러발생
one, two, three = t1   # t1=(10,20,30) 패킹된 튜플
print('one:', one)                  # 10

여기서 만약에
one, two, three, four=t1이라고 쓰면 오류남 튜플 원소 개수와 변수 개수가 같지 않기 때문에!
# ValueError: not enough values to unpack (expected 4, got 3)


---------------------------
### set(집합) 자료형의 특징
 1. 중복데이터를 저장할 수 없다.
 2. 순차적인 자료구조가 아니다.   --->    순서 있는 입/출력을 처리할 수 없다.

s1 = set([1,2,3,4])
print(s1)                           # {1, 2, 3, 4}

s2 = set('Hello')
print(s2)                           # {'e', 'H', 'o', 'l'} --- 중복 없이, 순차 없이

※ 집합(set)은 인덱싱을 할 수 없음    --- s2[1] 이런거 안된단 뜻임
1 s3 집합을 list로 변환 : list()
list1 = list(s3)
print(list1[0])                     # 1

2 s3 집합을 tuple로 변환 : tuple()
t1 = tuple(s3)
print(t1[2])                        # 3

# 이런 식으로 집합을 리스트나 튜플로 변환해 인덱싱을 하는 방식을 사용해야 함!


# 교집합 : &, intersection()
# 합집합 : |, union()
# 차집합 : -, difference()

s1 = set([1,2,3,4,5,6])
s2 = set([4,5,6,7,8,9])

1. 교집합
print(s1 & s2)                          # {4, 5, 6}
print(s1.intersection(s2))              # {4, 5, 6}

2. 합집합
print(s1 | s2)                          #  {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(s1.union(s2))                     #  {1, 2, 3, 4, 5, 6, 7, 8, 9}

3. 차집합
print(s2 - s1)                          # {8, 9, 7}
print(s2.difference(s1))                # {8, 9, 7}


# 집합의 함수

1. add() : 집합에 1개 값을 추가
s1 = set([1, 2, 3])
s1.add(3)                          # 중복된 값을 저장할 수 없다.
s1.add(4)                          # s1 : {1,2,3,4}

2. update() : 집합에 여러개의 값을 추가
s2 = set([1, 2, 3])
s2.update([4, 5, 6])             # s2 : {1, 2, 3, 4, 5, 6}

3. remove() : 집합의 특정 원소를 삭제
s3 = set([1, 2, 3])
s3.remove(2)                        # 원소 2를 삭제      s3 : {1,3}
s3.remove(3)                        # 원소 3를 삭제      s3 : {1}