Python | Iterable과 자료구조 (Set, Dict)

Stellar·2023년 10월 30일
0

Python

목록 보기
25/36
post-custom-banner

Iterable이란

파이썬에서 반복문에 사용되는 객체를 이터러블하다라고 하며,
반복되는 객체로 리스트, 튜플, 딕셔너리, 세트, range 등 여러개가 있다.

iter() 함수를 사용해 반복문에 사용이 가능한지 알 수 있다.

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

#불가능. 에러.
>>> print(iter(a))
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    print(iter(a))
TypeError: 'int' object is not iterable

#가능
>>> print(iter(list))
<list_iterator object at 0x103725420>

in을 사용하여 값의 유무 확인. 이터러블 함수에 모두 통용됨.

>>> if 'kim' in contacts :
           print('yes')
yes

>>> 'Korean' in scores
True
>>> 'Reading' in scores
False

Set와 Dictionary의 차이점

  • Set와 Dictionary는 중괄호 {}를 사용한다.
  • Set는 순서가 없어 인덱스 사용이 불가하다.
  • Set는 요소가 중복되면 자동으로 하나만 남는다.
  • Dictionary는 키(key)와 값(value)을 함께 저장한다.
  • set{}과 같이 중괄호를 사용하지만 Dictionary는 콜론(:)을 사용하여 키와 값을 구분한다.

set {} 집합

# 기본 문법

#중복 없음
>>> numbers = {2, 1, 3, 2, 2, 6, 7, 6, 290}
>>> numbers
{1, 2, 3, 290, 6, 7}
>>> mySet = set('Banana')
>>> mySet
{'n', 'a', 'B'}

#for도 마찬가지
>>> for i in numbers : 
           print(i, end = ' ')

1 2 3 290 6 7

#순서가 없다.
>>> fruit = {'Apple', 'Banana', 'Pineapple'}
>>> fruit
{'Banana', 'Apple', 'Pineapple'}

#인덱스 사용 불가
>>> numbers[0]
Traceback (most recent call last):
  File "<pyshell#82>", line 1, in <module>
    numbers[0]
TypeError: 'set' object is not subscriptable

# 괄호도 중괄호 내에서 혼합하여 사용이 가능하다.

>>> len(numbers)
3
>>> mySet = {1.0, 2.0, 'Hello world', (1, 2, 3)}
>>> mySet
{1.0, 2.0, (1, 2, 3), 'Hello world'}

# .add()를 사용해 추가할 수 있다.

>>> numbers.add(292929)
>>> numbers
{1, 2, 3, 290, 292929, 6, 7}

1. set의 연산

# 비교연산

>>> A = {1, 2, 3}
>>> B = {1, 2, 3}
>>> A == B
True
>>> A = {1, 2, 3, 4, 5}
>>> A > B
True

# .issubset() - 이즈 서브 셋, 교집합(부분집합)이냐?
>>> B.issubset(A)
True

# .issuperset() - 이즈 슈퍼 셋, 상위집합(확대집합??)이냐?
>>> A.issuperset(B)
True

# .isdisjoint() - 이즈 디스 조인트, 두 집합이 공통 원소를 갖지 않는가?
A.isdisjoint(B)
False
B.isdisjoint(A)
False

# 집합 연산

>>> A = {1, 2, 3, 4, 5}
>>> B = {1, 2, 3}

#합집합
>>> A | B #기호
{1, 2, 3, 4, 5}
>>> A.union(B) #메서드
{1, 2, 3, 4, 5}

#교집합
>>> A & B
{1, 2, 3}
>>> A.intersection(B)
{1, 2, 3}

#차집합
>>> A - B
{4, 5}
>>> A.difference(B) 
{4, 5}
>>> B.difference(A) #차집합은 빼기라서 순서에 영향을 받는다.
set()

set 집합연산 예제

Q. 왜 리스트로 감싸야 가능하지?
A. 리스트 괄호를 빼니까 에러남. 있는지 확인하는 거니까 순서가 뒤바뀌는건 상관없잖아?

partyA = set(['Park', 'Kim', 'Lee'])
partyB = set(['Park', 'Choi'])

print('파티에 동시 참석한 사람은 {}입니다.'.format(partyA & partyB))

=============================== RESTART: C:\Users\GIEC\Desktop\기초문법\1030\test.py ==============================
파티에 동시 참석한 사람은 {'Park'}입니다.

# 공백 set 만들기

word = set() #소괄호를 사용한다.

set 예제. 파일에서 중복되지 않은 단어의 개수

외부파일 proverbs.txt 필요 (영어로 문장을 적은 파일)

스플릿은 리스트를 생성한다고 적어두기.

#영문인 글자를 소문자로 만들어 반환.
def process(w) :
    output = ' '
    for ch in w :
        if (ch.isalpha()) :
            output += ch
    return output.lower()

words = set()

#파일 열기
fname = input('파일 이름 입력 : ')
file = open(fname, 'r') #r은 읽기 모드, w는 쓰기 모드

#파일의 모든 줄에 대하여 반복
for line in file : #마침표를 기준 한 줄씩 읽어 온다.
    lineWords = line.split() # 한 줄에서 공백을 기준하여 자른다.
    for word in lineWords :
        words.add(process(word)) #공백 세트에 함수 process()를 사용하여 걸러준 후 단어를 넣어준다.

#스플릿은 리스트를 생성한다.
print('사용된 단어의 개수 = ', len(words))
print(words)

#출력 시 단어의 순서가 계속해서 바뀌는걸 알 수 있다.

딕셔너리 {key : value}

# 기본 문법

>>> contacts = {'kim' : '01012345678', 'Park' : '01012345679', 'Lee' : '010123456780'}
>>> contacts
{'kim': '01012345678', 'Park': '01012345679', 'Lee': '010123456780'}

# .get(), 값 불러오기

#대괄호(인덱싱)
>>> contacts['kim']
'01012345678'

#소괄호(.get() 메소드)
>>> contacts.get('kim')
'01012345678'

.get 예제 - 영어 사전 만들기

.get() 메소드에서 찾을 단어를 적고 , 뒤에 찾는 단어가 없는 경우 문자열을 넣어 대신 출력할 수 있다.

english_dict = dict()

# 빈 딕셔너리에 값 넣기
english_dict['one'] = '하나'
english_dict['two'] = '둘'
english_dict['three'] = '셋'

#찾을 단어 입력 기능
word = input('영문 단어를 입력하세요 : ')
print(english_dict.get(word, '없음'))

# .items(), 키와 값을 동시에 부르기

딕셔너리는 .items()을 사용하여 키와 값을 동시에 부른다.

>>> for item in scores.items() :
         print(item)

('Korean', 80)
('Math', 90)
('English', 80)

# item() 메소드가 없는 경우 키만 나온다.
>>> for item in scores :
         print(item)
    
Korean
Math
English

# 항목 추가, 삭제

dict만의 방법으로 요소 추가하기

추가 시 맨 뒤에 위치 함.

#추가
>>> contacts['Choi'] = '01056781234'
>>> contacts
{'kim': '01012345678', 'Park': '01012345679', 'Lee': '010123456780', 'Choi': '01056781234'}

.pop(), del로 삭제하기

#삭제 .pop() 메소드
>>> contacts.pop('kim')
'01012345678'
>>> contacts
{'Park': '01012345679', 'Lee': '010123456780', 'Choi': '01056781234'}

#삭제 del
del contacts['Choi']
contacts
{'Park': '01012345679', 'Lee': '010123456780', 'Kim': '01012345678'}

# dict에 input 사용하기

dic = {input('한글 : 영어 << 형식으로 입력해주세요 : ')}

=============================== RESTART: C:\Users\GIEC\Desktop\기초문법\1030\test.py ==============================
한글 : 영어 << 형식으로 입력해주세요 : 바나나 : Banana
dic
{'바나나 : Banana'}

# dict 정렬

#키 정렬
>>> sorted(scores)
['English', 'Korean', 'Math']

#값 정렬 시 .values()를 붙여 줘야 함.
>>> sorted(scores.values())
[80, 80, 90]

dict 예제

dic 예제. 축약어 풀어쓰기

table = {'B4' : 'Before',
         'TX' : 'Thanks',
         'BBL' : 'Be Back Later',
         'BCNU' : 'Be Seeing You',
         'HAND' : 'Have A Nice Day',
         'CU' : 'See You',
         }

word = input('번역할 문장을 입력하시오 : ').split( )
sentence = ''

for i in word :
    if i in table :
        sentence += table[i] + ' '
    else :
        sentence += i + ' '

print(sentence)

dict 예제2. 파일에서 중복되는 단어의 개수, set 예제에서 파생.

외부파일 proverbs.txt 필요 (영어로 문장을 적은 파일)

fname = input('파일 이름 : ')
file = open(fname, 'r')

table = dict()

for line in file :
    words = line.split()
    for word in words :
        if word not in table:
            table[word] = 1
        else :
            table[word] += 1

print(table)

dict 예제3. 문장의 알파벳 단어 세기.

string = input('문자열을 입력하세요 : ')

countTable = {}
for letter in string :
    countTable[letter] = countTable.get(letter, 0) + 1

print(countTable)

dict 예제4. 문장의 알파벳 단어 세기

sentence = input('문자열을 입력하세요 : ')

table = { 'alphas' : 0, 'digits' : 0, 'spaces' : 0 }

for i in sentence :
    if i.isalpha() :
                 table['alphas'] += 1
    if i.isdigit() :
                 table['digits'] += 1
    if i.isspace() :
                 table['spaces'] += 1

print(table)
post-custom-banner

0개의 댓글