Range

reverse

a = [1, 23, 5, 6, 7]
for i in range(len(a), -1, -1) :
    print(i)

step

for i in range(0, 20, 2) :
    print(i)

# 0 2 4 6 ~ 20
test = [4, 3, 5, 11, 5]
for i in range(20, 0, -2) :
    print(i)

# 20 18 16 14 ... 2

다만, 아래와 같은 경우에는 루프를 (당연히) 안돈다

for i in range(10, 20, -2):
    print(i)

Array to String

list1 = ['a', 'b', 'c']
str1 = ''.join(list1)

근데, 숫자는 안의 내용물을 문자로 바꿔주고 join해야한다

list1 = [1, 2, 3]
str1 = ''.join([str(e) for e in list1])

띄어 쓰기를 중간에 넣어주려면

list1 = [1, 2, 3]
str1 = ' '.join([str(e) for e in list1])

Enumerate

index와 value를 한꺼번에 얻고 싶을때 사용하면 좋을것같다

t = [1, 5, 7, 33, 39, 52]
for p in enumerate(t):
  print(p)

(0, 1)
(1, 5)
(2, 7)
(3, 33)
(4, 39)
(5, 52)

연산(=만들기)

곱하기로 여러개 만든다

a = ['Hi'] * 5
print(a) # ['Hi', 'Hi', 'Hi', 'Hi', 'Hi']

a = [[]] * 3
print(a) # [[], [], []]

더하기로 붙인다

a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(c) # [1, 2, 3, 4, 5, 6]


a = [1, 2, 3]
b = [4, 5, 6]
a += b
print(a) # [1, 2, 3, 4, 5, 6]

주의 : A += B 와 A = A + B는 다르게 작동할 수 있다

a = [[1]] * 3
a[1] = a[1] + [2]
print(a) # [[1], [1, 2], [1]]


b = [[1]] * 3
b[1] += [2]
print(b) # [[1, 2], [1, 2], [1, 2]]
x가 배열 안에 있는지 체크
if 12 in [1, 2, 3, 6, 12, 20]:
    print("yes~")
else:
    print("no~")
# yes~

자르기

i번째 요소 ~ 마지막까지

list = [1, 2, 3, 4, 5]
result = list[2:]
print(result) # 3, 4, 5

i번째 ~ j번째

list = [1, 2, 3, 4, 5]
result = list[1:3]
print(result) # 2, 3

정렬

내부적으로 정렬하기

a = [1, 3, 7, 5, 2]
a.sort()
print(a) # [1, 2, 3, 5, 7]

정렬된 값을 돌려받기

a = [1, 3, 7, 5, 2]
b = sorted(a)
print(b) # [1, 2, 3, 5, 7]
print(a) # [1, 3, 7, 5, 2]

추가적으로 sort()는 배열만 받지만, sorted()는 dic도 받는다.

a = sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
print(a)

다만, value는 고려하지 않고 key만 본다.

오름차순과 내림차순

기본적으로 정렬은 오름차순으로 이루어지지만, reverse=True를 추가하면 내림차순으로 정렬된다.

a = [1, 3, 7, 5, 2]
a.sort(reverse=True)
print(a) # [7, 5, 3, 2, 1]

b = [1, 3, 7, 5, 2]
c = sorted(b, reverse=True) 
print(c) # [7, 5, 3, 2, 1]

요소가 여러개인 배열을 정렬

a = [[150, 250, 4], [2, 5, 3], [99, 150, 0], [1, 100, 1], [100, 301, 2]]
a.sort()
print(a) # [[1, 100, 1], [2, 5, 3], [99, 150, 0], [100, 301, 2], [150, 250, 4]]

첫번째 원소를 기준으로 정렬한다

사전순으로 정렬

a = ['b', 'a', 'z', 'c', 'd']
a.sort()
print(a) # ['a', 'b', 'c', 'd', 'z']

key를 통한 커스텀 정렬

대소문자 구분 없애기

key 없이 정렬을 하면, 대문자가 소문자보다 더 낮기 때문에 앞에 오게 된다.

s = "This is a test string from Andrew"
a = sorted("This is a test string from Andrew".split())
print(a) # ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']

key를 활용하면 원소들이 key에 들어있는 함수를 거쳐서 정렬된다. 아래의 예제에서도 split()해서 얻은 배열의 원소들이 str.lower함수를 거치면서 모두 소문자로 변환되고 정렬되기 때문에 문자열 ‘a’가 맨 앞에온다. 즉 대소문자를 구분 안하고 정렬이 된다

s = "This is a test string from Andrew"
a = sorted("This is a test string from Andrew".split(), key=str.lower)
print(a) # ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
내가 선택한 요소를 기준으로 정렬
students = [
    ('john', 'C', 15), # (이름, 성적, 나이)
    ('jane', 'A', 12),
    ('dave', 'B', 10),
]

# 나이순으로 정렬
by_age = sorted(students, key=lambda student: student[2])
print(by_age) # [('dave', 'B', 10), ('jane', 'A', 12), ('john', 'C', 15)]

# 등급순으로 정렬
by_grade = sorted(students, key=lambda el: el[1])
print(by_grade) # [('jane', 'A', 12), ('dave', 'B', 10), ('john', 'C', 15)]

key=lambda student: student[2] 이 부분은 key로 람다 함수를 쓴다는 의미고, 그 함수의 인자값으로 students의 원소를 (순서대로) 받는다. 이때 그 인자값의 변수 명을 student로 정해준거다. 그래야 함수의 body부분에서 원소에 접근(student[2]) 할 수 있다(당연한소리). 성적을 기준으로 정렬할때는 student 대신에 el을 썼다. 다시말해서 인자값에 이름은 아무렇게 정해도 상관 없다는 의미다.

물론 더 중요한거는 나이순으로 정렬하라는 의미에서 student[2]를 return했고, 등급순으로 정렬하라는 의미에서 el[1]을 return했다는 것이다.

이렇게 배열의 원소가 좀 복잡한 상황에서 정렬할때는 key인자가 매우 유용할것같다.

여러가지 built-in methods

append()

원소를 끝에 추가한다

list.append(element)

insert()

특정 위치에 요소를 추가한다

list = [1, 2, 3, 4, 5]
list.insert(2, 100)
print(list # [1, 2, 100, 3, 4, 5]

sum()

배열 안에있는 모든 원소들의 합을 구한다

sum([1, 2, 3])

Count()

배열안에 특정 값이 몇개있는지 센다

list = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1] 
print(list.count(1)) # 4

index()

특정 값이 배열의 몇번째(index)에 있는지 알아낸다

list = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1] 
print(list.index(2)) # 1 (2가 1번째에 있으니까!)
print(list.index(2, 3)) # 4 (3번째부터 시작해서 2를 찾는다)
print(list.index(1, 4, 7)) # 5 (4번째부터 7번째까지 1을 찾는다)

pop()

배열의 마지막 요소를 리턴하고 그 요소를 배열에서 제거한다.

list = [1, 2, 3]
a = list.pop()
print(a) # 3
print(list) # [1, 2]

del

list = [1, 2, 3]
del list[1]
print(list) # [1, 3]

remove()

맨 처음 발견한 요소를 삭제한다

list = [1, 2, 3, 4, 3, 3]
list.remove(3)
print(list) # [1, 2, 4, 3, 3]

기타 등등

배열 마지막 요소 선택

list = [1, 2, 3, 4, 5]
result = list[-1]
print(result) # 5

A = A[::-1]

list = [1, 2, 3, 4]
list = list[::-1]
print(list) # [4, 3, 2, 1]