본문 바로가기
python 및 머신러닝/Coding The Matrix

[Coding The Matrix] 코딩 더 매트릭스 - Chapter 1 함수

by java개발자 2015. 8. 11.
# -*- coding: utf-8 -*-
from myutil import consolePrintWithLineNumber as c    # 파이썬이 자동으로 제공해주는 print 함수 대신 사용한다.
'''
Created on 2015. 8. 11.

@author: Administrator
'''

'''
1p
  Chapter 1 함수

  1.1
    집합
    중괄호
    무한집합
    유한집합
  1.2 카테시안 곱
2p
  1.3 함수
    출력 : 입력의 상(image)
    입력 : 출력의 원상(pre-image)
3p
    f : 정의역 -> 공역(치역)
    공역 : 함수값이 선택되는 집합(가능한 출력의 집합)
    치역 : 모든 정의역 원소들에 대한 함수값들의 집합(실제로 함수값이 되는 공역 원소들의 집합)
    <번역오류?> 
      Example 1.3.5 
      하지만 정의역의 어떤 원소도 소수로 매핑되지 않기 때문에
      -> 하지만 치역의 어떤 원소도 소수로 매핑되지 않기 때문에
4p
    함수
    프로시저
    계산문제
5p
    항등함수
7p
    역함수
    전사함수(onto) : 공역 = 치역
8p
    단사함수(one-to-one) : 정의역과 공역이 서로 각각 매칭됨.(중복되지 않음)
    가역함수 : 역함수가 존재하는 함수
    가역함수 <=> 단사함수 + 전사함수
  
'''
# 16p
c(100 // 5.1)
c(100 / 5.1)
c(6 / 11)    # 파이썬2.x에서는 결과값이 0이지만 파이썬3.x에서는 0.5454545454이다.
c(44 + 11 * 4 - 6 / 11)
c(44 + 11 * 4)

c(1 * 60 * 24 * 7)
c(2304811 % 47)
c(2304811 // 47)
c(2304811 - (2304811 // 47) * 47)

# 17p
c(1e16 + 1)

c('문자')
c("문자'")
c("문자\"")
c('''문자"''')

c(5 == 4)
c(4 == 4)
c((673 + 909) % 3 == 0)

# 18p
x = -9
y = 1 / 2
c(2 ** (y + 1 / 2) if x + 10 < 0 else 2 ** (y - 1 / 2))

# 19p
# 집합(Set) : 순서없음, 중복없음, 중괄호{}, 집합 포함 불가능(변경 불가능한 자료형)
c({1 + 2, 3, "a"})
c(sum({1, 2, 3}, 10))
S = {1, 2, 3}
c(2 in S)
c(4 not in S)

# 20p
c({1, 2, 4} | {2, 3, 4})
c({1, 2, 4} & {2, 3, 4})

S = {1, 2, 3}
S.add(4)
S.remove(2)
c(S)
S.update({4, 5, 6})
c(S)
S.intersection_update({5, 6, 7, 8, 9})
c(S)
T = S
T.remove(5)
c(S)

# 21p
U = S.copy()
U.add(5)
c(S)

c({2 * x for x in {1, 2, 3}})
c({x ** 2 for x in {1, 2, 3, 4, 5}})

c({2 ** x for x in {0, 1, 2, 3, 4}})
c(S)
c({x * x for x in S | {5, 7}})
c({x * x for x in S | {5, 7} if x > 2})

# 22p
c({x * y for x in {1, 2, 3} for y in {2, 3, 4}})
  # Task1.5.7
c({x * y for x in {1, 2, 3} for y in {12, 13, 14}})
c({x * y for x in {1, 2, 3} for y in {2, 3, 4} if x != y})

  # Task1.5.8 ???? 문제가 이해가 안됨.
  # Task1.5.9
S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
c({x for x in S if x > 2 and x < 5})

  # Remarks
  # c({{1, 2}, 3})
  # 에러메시지 - TypeError: unhashable type: 'set'
  # unhashable이란 뜻은 hash값을 만들어 낼 수 없다는 뜻이다. '변경불가능한 집합' 과 이것이 어떤 관련이 있는지 모르겠다.  

# 23p
# 리스트(List) : 순서있음, 중복있음, 대괄호[], 집합 또는 다른 리스트 포함 가능(변경가능한 자료형)
c([1, 1 + 1, 3, 2, 3])
c([[1, 1 + 1], {2, 3, 4, 2}, 'yo'])
c(len([[1, 1 + 1], {2, 3, 4, 2}, 'yo']))
c(sum([1, 2, 0, 1, 0, 3]))
c(sum([1, 2, 0, 1, 0, 3], -2))

c(sum([20, 10, 15, 75]) / 4)

c([1, 2, 3] + ["my", 'word'])
mylist = [4, 8, 12]
c(mylist + ['m', 'y'])
c(mylist)

# 24p
# sum은 집합<숫자>이나 리스트<숫자>에 대해서는 숫자 합산 기능.
#       리스트<리스트>인 경우는 리스트를 합치는 기능을 한다. 두번째 자리에 [] 필수
# TypeError: unsupported operand type(s) for +: 'int' and 'list'
# sum의 두번째 인수는 default로 숫자 자리인가 보다. 그런데 리스트를 합칠때 두번째 자리를 비워두면, 리스트와 단순한 숫자를 합치게 되므로 오류!!! 그래서 그 자리에 빈 리스트[]
c(sum([[1, 2, 3], [4, 5, 6], ['y']], []))
          
c([2 * x for x in {2, 1, 3, 4, 5}])    # 집합(순서없음)
c([2 * x for x in [2, 1, 3, 4, 5]])    # 리스트(순서유지)

c([x * y for x in [1, 2, 3] for y in [10, 20, 30]])

c([[x, y] for x in ['A', 'B', 'C'] for y in [1, 2, 3]])

  # Task1.5.12
LofL = [[1, 2, 3, 4]]
c(sum(x) for x in LofL)    #  왜?? 이렇게 나오지??
c([sum(x) for x in LofL])    # [10]
LofL = [[1, 2, 3, 4], [4, 4, 4, 4]]
c([sum(x) for x in LofL])    # [10, 16]
c(sum([sum(x) for x in LofL]))    # 26
LofL = [[.25, .75, .1], [-1, 0], [4, 4, 4, 4]]
c(sum([sum(x) for x in LofL]))    # 16.1

# 25p
c(mylist[0])
# c(['in', 'the', 'CIT'][9])    # 에러 IndexError: list index out of range
c(['in', 'the', 'CIT'][1])

L = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
c(L)    # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

# 인덱싱 [a:b]는 a <= x < b
c(L[:])    # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# c(L[0.5])    # 에러 TypeError: list indices must be integers, not float
c(L[1])    # 10
c(L[:5])    # [0, 10, 20, 30, 40]
c(L[5:])    # [50, 60, 70, 80, 90]

# 불연속 인덱싱 [a:b:c]는 a <= x < b and (x-a) % c == 0 , c>0 (a를 차감한 상대적인index부터 시작해서)
c(L[::])    # [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
c(L[::2])    # [0, 20, 40, 60, 80]
c(L[::3])    # [0, 30, 60, 90]
c(L[::-3])    # [90, 60, 30, 0] 예외적인 상황인듯
c(L[0:10:-3])    # [] 위와 같은 표현같은데 왜 결과가 없을까?
c(L[0::-3])    # [0] 그냥 c>0으로 사용하자 -_-;;
# c(L[0::0])    #에러 ValueError: slice step cannot be zero
# c(L[::-0.5])  #에러 TypeError: slice indices must be integers or None or have an __index__ method
c(L[2::2])    # [20, 40, 60, 80]
c(L[2:10:3])    # [20, 30, 40]

# 26p
# 언패킹
[x, y, z] = [4 * 1, 4 * 2, 4 * 3]
c(x, y, z)
x, y, z = [4 * 1, 4 * 2, 4 * 3]    # 위와 같은데??
c(x, y, z)

# [x,y] = [4 * 1, 4 * 2, 4 * 3]    #에러 ValueError: too many values to unpack (expected 2)
# [x, y, z] = [4 * 1, 4 * 2]    # 에러 ValueError: need more than 2 values to unpack

listoflists = [[1, 1], [2, 4], [3, 9]]
c([y for [x, y] in listoflists])

# listoflists = [[1], [2], [3]]
# c([y for [x, y] in listoflists])  #에러 ValueError: need more than 1 value to unpack

mylist = [30, 20, 10]
mylist[1] = 0
c(mylist)    # [30, 0, 10]
# mylist[0:1] = 1  #에러 TypeError: can only assign an iterable

# 튜플(Tuple) : 순서 있음, 변경불가, 집합의 원소가능, 괄호()
# 보통 파이썬 한국어 용어로 터플보단 튜플을 많이 사용하는 듯.
c((1, 1 + 3, 2))
c({0, (1, 2)} | {(3, 4, 5)})

# p27
mytuple = ('all', 'my', 'books')
c(mytuple[1])
c((1, {'a', 'b'}, 3.14)[2])

(a, b) = (1, 5 - 3)
c(a)
a, b = (1, 2)
c(b)

a, b = 1, 5 - 3
c(a, b)

c([y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')]])
c((y for (x, y) in [(1, 'a'), (2, 'b'), (3, 'c')]))    # 출력 generator object ...

  # Task1.5.14
S = {-4, -2, 1, 2, 5, 0}
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0])
  # Task1.5.15
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)])
  # Task1.5.16
c([(i, j, k) for i in S for j in S for k in S if i + j + k == 0 and (i, j, k) != (0, 0, 0)][0])

  # S의 원소 중 합이 영이 되는 100-원소 터플이 있는지 결정하기를 원한다고 해 보자.  
  # S를 구성하는 정수가 아주 많을 경우에도 빠르고 확실하게 문제를 해결할 수 있는 방법이 있는가?(만약 있다면, 그 방법으로 Ph.D를 받을 수 있을 것이다.)
  # > 헐~~~ 박사학위가...;;;;;;
  
# 28p
# 컬렉션 생성 및 변환
c(range(10))    # range(0, 10)
c(set(range(10)))
c(set({1, 2, 3}))
c(set([1, 2, 3]))
c(set((1, 2, 3)))
c(list({1, 2, 3}))
c(list([1, 2, 3]))
c(list((1, 2, 3)))

  # 1.5.17
L = [1, 2, 3, 4, 5, 1, 2]    # 중복값이 있는 경우
c(len(L))    # 7
c(len(list(set(L))))    # 5

'''
  아직 잘 이해안됨
  
  집합,리스트,튜플의 변경 가능, 변경 불가능에 대해서, - 실제로는 다 되는 것 같은데,,, 메모리 할당의 차이인가?
  누구는 원소로 가능하고, 원소로 불가능한 이유....???
  
  >> 정리: 
  변경불가능 : 집합, 튜플
  변경가능 : 리스트
  
  일반객체 : 숫자, 문자
  집합의 원소 : 객체, 튜플
  튜플의 원소 : 객체, 튜플, 집합, 리스트
  리스트의 원소 : 객체, 튜플, 집합, 리스트
  
'''

# 제너레이터
c([i for i in range(10)])    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
c({i for i in range(10)})    # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
c((i for i in range(10)))    # 출력 generator object...  왜 튜플만,,,???
c(tuple(i for i in range(10)))    # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

# Range
c(sum({i * i for i in range(10)}))
c({i for i in range(100) if i % 2 == 1})

# 29p
# range(a,b) : a <= x < b
c(list(range(1, 6)))    # [1, 2, 3, 4, 5]
# range(a,b,c) : a <= x < b and (x-a) % c == 0  
c(list(range(1, 6, 2)))    # [1, 3, 5]

# zip > 튜플생성
c(zip([1, 2, 3], [2, 4, 6]))    # zip object...
c(list(zip([1, 2, 3], [2, 4, 6])))    # [(1, 2), (2, 4), (3, 6)]
c(set(zip([1, 2, 3], [2, 4, 6])))    # {(1, 2), (2, 4), (3, 6)}

characters = ['Neo', 'Morpheus', 'Trinity']
actors = ['Keanu', 'Laurence', 'Carrie-Anne']
c(set(zip(characters, actors)))
c([character + ' is  played by ' + actor for (character, actor) in zip(characters, actors)])

  # Taskask 1.5.19
L = ['A', 'B', 'C', 'D', 'E']
c(list(zip(list(range(5)), L)))

  # Task.1.5.20
c([x + y for (x, y) in list(zip([10, 25, 40], [1, 15, 20]))])

# reversed
c([x * x for x in reversed([4, 5, 10])])

# 30p

# 딕셔너리, 순서없음, 중괄호{}, 집합에서 KEY:VALUE의 쌍으로 존재, KEY는 변경 불가능(KEY로 집합, 리스트, 딕셔너리 사용 불가)
c({2 + 1:'thr' + 'ee', 2 * 2:'fo' + 'ur'})
c({2 + 1:'thr' + 'ee', 2 + 1:'fo' + 'ur'})    # KEY 중복 불가


c({4:'four', 3:'three'}[4])
mydict = {'Neo':'Keanu', 'Morpheus':'Laurence'}
c(mydict['Neo'])
# c(mydict['Neo1'])    # KeyError: 'Neo1'

# 31p
c('Oracle' in mydict)    # False
c('Neo' in mydict)    # True

c(1 in range(10))    # True
c(11 in range(10))    # False
c(mydict['Neo'] if 'Neo' in mydict else 'Not')    # 이건 필터 if 가 아니다.
  # Task1.5.21
dlist = [{'James':'Sean', 'director':'Terence'}, {'James':'AA', 'director':'BB'}, {'James':'CC', 'director':'DD'}]
k = 'James'
c([x[k] for x in dlist])

  # Task1.5.22
dlist = [{'Bilbo':'Ian', 'Frodo':'Elijah'}, {'Bilbo':'mar', 'Thorin':'Rich'}]
k = 'Frodo'
c([x[k] if k in x else 'NOT PRESENT' for x in dlist])

mydict['Agent Smith'] = 'Hugo'
mydict['Neo'] = 'Philip'
c(mydict) 

# 32p
c({k for (k, v) in [(3, 2), (4, 0), (100, 1)]})
c({k:v for (k, v) in [(3, 2), (4, 0), (100, 1)]})
c({(x, y) : x * y for x in [1, 2, 3] for y in [1, 2, 3]})

  # Task1.5.23
c({k:k * k for k in range(100)})

  # Task1.5.24 항등함수
D = {'red', 'white', 'blue'}
c({k:k for k in D})    # {'blue': 'blue', 'red': 'red', 'white': 'white'}   이게 맞나?

  # Task1.5.25 좀... 어렵네;; > VALUE를 숫자조합으로 먼저 구해서, VALUE 로 KEY 를 만들어서 조합하자.
  # 이걸 Java로 해야한다면,,, 많이 복잡하겠군;;;
base = 10    # 0 < base <= 10, 알파벳은 좀 무리다... 
digits = set(range(base))
c([[x, y, z] for x in digits for y in digits for z in digits])
c({x * base ** 2 + y * base ** 1 + z : [x, y, z] for x in digits for y in digits for z in digits})

c(list(mydict.keys()))
c(set(mydict.values()))

# 33p
c([m for m in mydict.items()])
c([k + " is " + v for (k, v) in mydict.items()])

  # Task1.5.26 문제 이해가 안됨;;
id2salary = {0:1000.0, 3:990, 1:1200.50}
names = ['Larry', 'Curly', '', 'Moe']
c([names[k] for (k, v) in id2salary.items()])
c({names[k]:id2salary[k] for (k, v) in id2salary.items()})

def twice(z): return 2 * z
c(twice(12))    # 24
c(twice([3, 4]))    # [3, 4, 3, 4]
c(twice('abc12'))    # abc12abc12

# 34p
def nextInts(L): return [k + 1 for k in L]
c(nextInts([1, 5, 7]))

def cubes(L): return [k ** 3 for k in L]
c(cubes([1, 2, 3]))

def dict2list(dct, keylist): return [dct[i] for i in keylist] 
c(dict2list({'a':'A', 'b':'B', 'c':'C'}, ['b', 'c', 'a']))

def list2dict(L, keylist): return {k:v for (k, v) in zip(keylist, L)}
c(list2dict(['A', 'B', 'C'], ['a', 'b', 'c']))

def all_3_digit_numbers(base, digits): return {x * base ** 2 + y * base + z for x in digits for y in digits for z in digits}
c(all_3_digit_numbers(3, {0, 1, 2}))

# end


















콘솔 결과

47 >  19.0
48 >  19.607843137254903
49 >  0.5454545454545454
50 >  87.45454545454545
51 >  88
53 >  10080
54 >  25
55 >  49038
56 >  25
59 >  1e+16
61 >  문자
62 >  문자'
63 >  문자"
64 >  문자"
66 >  False
67 >  True
68 >  False
73 >  1.0
77 >  {'a', 3}
78 >  16
80 >  True
81 >  True
84 >  {1, 2, 3, 4}
85 >  {2, 4}
90 >  {1, 3, 4}
92 >  {1, 3, 4, 5, 6}
94 >  {5, 6}
97 >  {6}
102 >  {6}
104 >  {2, 4, 6}
105 >  {16, 1, 9, 25, 4}
107 >  {8, 1, 2, 16, 4}
108 >  {6}
109 >  {25, 49, 36}
110 >  {25, 49, 36}
113 >  {2, 3, 4, 6, 8, 9, 12}
115 >  {36, 39, 42, 12, 13, 14, 24, 26, 28}
116 >  {2, 3, 4, 6, 8, 12}
122 >  {3, 4}
131 >  [1, 2, 3, 2, 3]
132 >  [[1, 2], {2, 3, 4}, 'yo']
133 >  3
134 >  7
135 >  5
137 >  30.0
139 >  [1, 2, 3, 'my', 'word']
141 >  [4, 8, 12, 'm', 'y']
142 >  [4, 8, 12]
149 >  [1, 2, 3, 4, 5, 6, 'y']
151 >  [2, 4, 6, 8, 10]
152 >  [4, 2, 6, 8, 10]
154 >  [10, 20, 30, 20, 40, 60, 30, 60, 90]
156 >  [['A', 1], ['A', 2], ['A', 3], ['B', 1], ['B', 2], ['B', 3], ['C', 1], ['C', 2], ['C', 3]]
160 >   at 0x027A4508>
161 >  [10]
163 >  [10, 16]
164 >  26
166 >  16.1
169 >  4
171 >  the
174 >  [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
177 >  [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
179 >  10
180 >  [0, 10, 20, 30, 40]
181 >  [50, 60, 70, 80, 90]
184 >  [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
185 >  [0, 20, 40, 60, 80]
186 >  [0, 30, 60, 90]
187 >  [90, 60, 30, 0]
188 >  []
189 >  [0]
192 >  [20, 40, 60, 80]
193 >  [20, 50, 80]
198 >  (4, 8, 12)
200 >  (4, 8, 12)
206 >  [1, 4, 9]
213 >  [30, 0, 10]
218 >  (1, 4, 2)
219 >  {(1, 2), 0, (3, 4, 5)}
223 >  my
224 >  3.14
227 >  1
229 >  2
232 >  (1, 2)
234 >  ['a', 'b', 'c']
235 >   at 0x027A44E0>
239 >  [(0, 0, 0), (0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)]
241 >  [(0, 2, -2), (0, -2, 2), (1, 1, -2), (1, -2, 1), (2, 0, -2), (2, 2, -4), (2, -4, 2), (2, -2, 0), (-4, 2, 2), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0)]
243 >  (0, 2, -2)
251 >  range(0, 10)
252 >  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
253 >  {1, 2, 3}
254 >  {1, 2, 3}
255 >  {1, 2, 3}
256 >  [1, 2, 3]
257 >  [1, 2, 3]
258 >  [1, 2, 3]
262 >  7
263 >  5
283 >  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
284 >  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
285 >   at 0x027FE968>
286 >  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
289 >  285
290 >  {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99}
294 >  [1, 2, 3, 4, 5]
296 >  [1, 3, 5]
299 >  

300 > [(1, 2), (2, 4), (3, 6)] 301 > {(1, 2), (2, 4), (3, 6)} 305 > {('Morpheus', 'Laurence'), ('Neo', 'Keanu'), ('Trinity', 'Carrie-Anne')} 306 > ['Neo is played by Keanu', 'Morpheus is played by Laurence', 'Trinity is played by Carrie-Anne'] 310 > [(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')] 313 > [11, 40, 60] 316 > [100, 25, 16] 321 > {3: 'three', 4: 'four'} 322 > {3: 'four'} 325 > four 327 > Keanu 331 > False 332 > True 334 > True 335 > False 336 > Keanu 340 > ['Sean', 'AA', 'CC'] 345 > ['Elijah', 'NOT PRESENT'] 349 > {'Neo': 'Philip', 'Morpheus': 'Laurence', 'Agent Smith': 'Hugo'} 352 > {3, 4, 100} 353 > {100: 1, 3: 2, 4: 0} 354 > {(1, 2): 2, (3, 2): 6, (1, 3): 3, (2, 3): 6, (3, 3): 9, (2, 2): 4, (3, 1): 3, (1, 1): 1, (2, 1): 2} 357 > {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225,,,,,,, 92: 8464, 93: 8649, 94: 8836, 95: 9025, 96: 9216, 97: 9409, 98: 9604, 99: 9801} 361 > {'red': 'red', 'blue': 'blue', 'white': 'white'} 367 > [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 0, 6], [0, 0, 7], [0, 0, 8], ,,,,,, [9, 9, 2], [9, 9, 3], [9, 9, 4], [9, 9, 5], [9, 9, 6], [9, 9, 7], [9, 9, 8], [9, 9, 9]] 368 > {0: [0, 0, 0], 1: [0, 0, 1], 2: [0, 0, 2], 3: [0, 0, 3], 4: [0, 0, 4], 5: [0, 0, 5], 6: [0, 0, 6],,,,, 995: [9, 9, 5], 996: [9, 9, 6], 997: [9, 9, 7], 998: [9, 9, 8], 999: [9, 9, 9]} 370 > ['Neo', 'Morpheus', 'Agent Smith'] 371 > {'Philip', 'Hugo', 'Laurence'} 374 > [('Neo', 'Philip'), ('Morpheus', 'Laurence'), ('Agent Smith', 'Hugo')] 375 > ['Neo is Philip', 'Morpheus is Laurence', 'Agent Smith is Hugo'] 380 > ['Larry', 'Curly', 'Moe'] 381 > {'Curly': 1200.5, 'Larry': 1000.0, 'Moe': 990} 384 > 24 385 > [3, 4, 3, 4] 386 > abc12abc12 390 > [2, 6, 8] 393 > [1, 8, 27] 396 > ['B', 'C', 'A'] 399 > {'a': 'A', 'c': 'C', 'b': 'B'} 402 > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}