リスト、凡例の整理
リスト#リスト#
他のプログラミング言語の
배열
と同じです.可変オブジェクト.
宣言せずにリストのサイズを制限します.資料型に限らない.
// Java
String[] arr = new String[5];
# Python
arr = []
arr2 = [1, "3", True, datetime.datetime.now(), (5, 1), {"a":"A", "b":"B"}]
要素を追加します。append() .extend() .insert()
.append()
a = [1, 2, 3]
a.append(5)
print(a)
>>> Output
[1, 2, 3, 5]
Pythonのリストには長さ宣言が限定されていませんが、インデックス形式で追加できますか?→ No!
a = [1, 2, 3]
# 다음번 추가 될 인덱스는 a[3] 이다.
a[3] = 4
>>> Output
IndexError: list assignment index out of range
# 대신, 아래 방법으로 대체가 가능하다.
a[3:] = [4]
Pythonに配列を入れる場合(置換でなければ).append()を利用!extend()
a = [1, 2, 3]
a.extend([4, 5]) # a += [4, 5] 도 같은 효과
print(a)
>>> Output
[1, 2, 3, 4, 5]
Tip!+演算図.extend()と同じ結果を生成します.
a, b = [1, 2, 3], [4, 5]
print(a + b) → [1, 2, 3, 4, 5]
+=度はやはり役に立ちます.
a += b
print(a) → [1, 2, 3, 4, 5]
insert()
a = [0, 1, 2]
a.insert(1, 10)
print(a)
>>> Output
[0, 10, 1, 2]
では、extendのように1つだけ挿入するのではなく、多くの要素を追加することはできませんか?a.insert(1, [6, 7, 8])
a.insert(1, [6, 7, 8])
# 기대값: a = [0, 10, 1, 2] 였으므로, [0, 6, 7, 8, 10, 1, 2] 이지 않을까?
print(a)
>>> Output
[0, [6, 7, 8], 10, 1, 2]
その時はリストSleingでもう一度やりましょう # CASE 1
a = [0, 1, 2]
b = a[0:1] + [6, 7, 8] + a[1:]
print(b)
# CASE 2
c = [0, 1, 2]
c[1:1] = [6, 7, 8]
print(c)
>>> Output
[0, 6, 7, 8, 1, 2]
[0, 6, 7, 8, 1, 2]
"""
b = a[0:1]
b.extend([6, 7, 8])
b.extend(a[1:])
위 extend 방식보다 +가 훨씬 간결하다.
"""
要素を削除します。pop()とdelキーワード
# .pop()에 인자가 없으면 마지막걸 지운다
a = [1, 4, 3, 9]
a.pop()
print(a)
# .pop(n)은 n번째 인덱스를 지운다.
b = [2, 5, 6, 7]
b.pop(2)
print(b)
>>> Output
[1, 4, 3]
[2, 5, 7]
a = [1, 4, 3, 9]
del a[-1] # 맨 마지막
print(a)
b = [2, 5, 6, 7]
del b[2]
print(b)
c = [7, 8, 9, 0]
del c[1:2] # 범위 지정해서 제거도 가능!
print(c)
>>> Output
[1, 4, 3]
[2, 5, 7]
[7, 0]
# 1~ 45까지 숫자가 적힌 종이가 통안에 있다.
# 이때, 무작위로 한장을 뽑아 발표하고 뽑은 종이는 통에서 제거한다.
import random
numbers = list(range(1, 46))
random.shuffle(numbers)
# Case 1) del 사용
# 범위 삭제 가능!
# 딕셔너리에서도 사용 가능!
pop_num = numbers[0] # 값을 사전에 할당하고
del numbers[0] # 지워야 한다.
print(f"첫 당첨번호는 {pop_num} 입니다!")
# Case 2) .pop() 사용
# 두줄보단 한줄이 간결하니까..!
# 한번에 하나씩만 삭제 가능!
pop_num = numbers.pop() # 통에서 제거한 당첨번호 리턴
print(f"다음 당첨번호는 {pop_num} 입니다!")
print(pop_num in numbers) # 뽑은 번호는 통에 없다
>>> Output
첫 당첨번호는 32 입니다!
다음 당첨번호는 11 입니다!
False
特定の値のインデックスを検索します。index()
a = [5, 10, 15, 10, 35, 20]
print(a.index(10))
>>> Output
1
最初に見つかったインデックスを返します(リストに検索する値が複数ある場合でも). arr = [0, 10, 0, 13, 10, 15, 0, 0, 7]
del_target = 0
find_index = False
while del_target in arr:
del arr[arr.index(del_target)] # or arr.pop(a.index(del_target))
print(arr)
>>> Output
[10, 13, 10, 15, 7]
特定の値の個数を求めます。count()
arr = [10, 20, 30, 15, 20, 40]
print(arr.count(20))
>>> Output
2
を選択します。sort()
a = [10, 20, 30, 15, 20, 40]
a.sort()
print(a)
>>> Output
[10, 15, 20, 20, 30, 40]
順序を反転します。reverse()
a = [10, 20, 30, 15, 20, 40]
a.reverse()
print(a)
>>> Output
[40, 30, 20, 20, 15, 10]
反復文でrange()とともに逆シーケンスで値を受け入れるreverse()とは異なります.[ list ].reverse() < > reversed(range(10))
個人的には...
ソートの場合はlist,dictionaryで比較的多く,sorded()関数を統一的に用いるのが一般的である.
ソート(a)#昇順
ソート(a,reverse=True)#降順
sorted({ ... dict }, key=lambda x: x[1], reverse=True)
初期化clear()
a = [10, 20, 30, 15, 20, 40]
a.clear()
print(a)
b = [10, 20, 30, 15, 20, 40]
del b[:] # [(처음부터):(끝까지)]
print(b)
>>> Output
[]
[]
その他
arr = [1, 2, 3]
if arr:
print("arr은 비어있지 않네요")
"""
if len(arr) > 0: 와 동치이다.
대상 리스트의 원소갯수를 세고, 갯수가 0 초과이면(비어있지 않다면?)
"""
arr2 = []
if not arr:
print("arr은 비어있군요")
>>> Output
arr은 비어있지 않네요
arr은 비어있군요
チェックリスト arr = [1, 2, 3]
# Case 1) .index() 활용
# .index()는 찾을 대상이 없으면 Exception 발생
try:
if arr.index(1):
print("리스트에 '1'이 있어요")
except ValueError:
print("리스트에 '1'은 없어요")
# Case 2) in 활용
# 찾을 대상이 리스트에 없어도 예외가 발생하지 않는다.
if 1 in arr:
print("리스트에 '1'이 있어요")
else:
print("리스트에 '1'은 없어요")
arr = [10, 20, 10, 15, 20, 40]
arr = list(set(arr)) # [40, 10, 20, 15]
可変オブジェクトのコピー
可変オブジェクトを再割り当てするときは注意してください.aをbに代入して宣言すると、値のコピーだけではありません.
実はよくあるミス!!!
たとえば
"""
1~10 까지 숫자를 가지는 numbers1, numbers2를 만든다
단, numbers2 의 앞 5개 원소는 2배씩 증가시켜 저장한다. 이때, numbers1 은 보존되어야 한다.
"""
numbers1 = list(range(1, 11)) # 1. 1~10까지 리스트에 할당
numbers2 = numbers1 # 2. numbers2에 numbers1의 사본이 생겼겠지?
for i in range(5):
numbers2[i] *= 2
print(numbers1)
print(numbers2)
>>> Guess
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # numbers1
[2, 4, 6, 8, 10, 6, 7, 8, 9, 10] # numbers2
>>> Output
[2, 4, 6, 8, 10, 6, 7, 8, 9, 10] # numbers1도 같이 변해버렸다?
[2, 4, 6, 8, 10, 6, 7, 8, 9, 10]
各変数のidは同じ値です.print(f"numbers1의 id는 {id(numbers1)} 입니다")
print(f"numbers2의 id는 {id(numbers2)} 입니다")
>>> Output
numbers1의 id는 140573167644800 입니다
numbers2의 id는 140573167644800 입니다
このようなことが起こりたくないなら?コピー先copy()メソッドnumbers1 = list(range(1, 11)) # 1. 1~10까지 리스트에 할당
numbers2 = numbers1.copy() # 2. numbers2에 numbers1과 같은 값이지만 다른 id를 가진다
"""
아니면 또 쓰기..
numbers2 = list(range(1, 11))
"""
for i in range(5):
numbers2[i] *= 2
print(f"id: {id(numbers1)}, {numbers1}")
print(f"id: {id(numbers2)}, {numbers2}")
>>> Output
id: 140704004809600, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
id: 140704004809536, [2, 4, 6, 8, 10, 6, 7, 8, 9, 10] # id도 다르고 numbers2만 바뀌었다.
リスト式
[]リストカッコに要素がリストされず、forとifが含まれている場合は、リスト式を使用します.
# 1) for만 이용한 표현법
arr = [i for i in range(10)] # arr = [0, 1, 2, ... 9]
# for 에서 반복되며 생성된 i가 배열에 대입된다.
# 2) 그럼 여기에서 가중치를 줄 수 있나?
arr2 = [i+1 for i in range(10)] # arr2 = [1, 2, 3, ... 10]
# 3) 여기에서 혹시 조건을 줄 수 있나? 짝수만 담을래
arr3 = [i for i in range(10) if i % 2 == 0]
# 주의)
arr4 = [i+1 for i in range(10) if i % 2 == 0]
# 여기에서 i+1이 대입되지만, if에서 비교하는 i 와는 다르다. (i <> i+1)
# 타이핑 상 대입부를 먼저 기록하다보면 햇갈릴 수 있음!
# Case 1: 리스트 표현식
arr1 = [i+1 for i in range(10) if i % 2 == 0]
# Case 2: 상세 기술
arr2 = []
for i in range(10):
if i % 2 == 0:
arr2.append(i+1)
条件が複雑になると、リスト式には限界があります.できるだけ簡単に! gugudan = [f"{x}x{y}={x*y}" for x in range(2, 10) for y in range(1, 10)]
print(gugudan)
"""
gugu = []
for x in range(2, 10):
for y in range(1, 10):
gugu.append(f"{x}x{y}={x*y}")
"""
>>> Output
['2x1=2', '2x2=4', ... '9x9=81']
# m x n 일때, m은 짝수, n은 홀수만 기록하면?
gugudan = [
f"{x}x{y}={x*y}"
for x in range(2, 10)
for y in range(1, 10)
if x % 2 == 0 and y % 2 == 1
]
# 마지막 조건부에서 중첩 for의 x, y 모두 가져와 비교할 수 있다.
print(gugudan)
>>> Output
['2x1=2', '2x3=6', '2x5=10', '2x7=14', '2x9=18', '4x1=4', '4x3=12', '4x5=20', '4x7=28', '4x9=36', '6x1=6', '6x3=18', '6x5=30', '6x7=42', '6x9=54', '8x1=8', '8x3=24', '8x5=40', '8x7=56', '8x9=72']
# 0 ~ 9 까지 수를 가지는 리스트
x = [i for i in range(10)]
y = list(range(10))
print(x, y)
# "hello world" 를 Hello World로 출력하기 위해 "Hello", "World" 로 전처리 해두기
x = [i.capitalize() for i in "hello world".split()]
y = list(map(lambda i: i.capitalize(), "hello world".split()))
print(x, y)
tuple(tuple)
リストに似ているが変形できない可変オブジェクト.
リストが四角カッコの場合、tupleは()カッコです.
基本的にtupleは宣言後に変形できない.
a = (1, 2, 3)
print(a[2]) # Output >> 2
a[2] = 5 # 대입할 수 없다.
>>> Output
TypeError: 'tuple' object does not support item assignment
上のリストと違うところだけ見ていたら、すぐに理解できたかな…?リストと比較テーブル
新しい値を追加しなければならない場合
毎回再発表するわけにはいかない...
# 기존 리스트와 비교를 위해
list_a = [1, 2, 3]
print(f"더하기 전 id: {id(list_a)}")
list_a.append(5)
print(f"더한 후 id: {id(list_a)}") # 동일한 id가 찍힌다.
print(list_a) # [1, 2, 3, 5]
# 튜플은?
tuple_a = (1, 2, 3)
print(f"더하기 전 id: {id(tuple_a)}") # 140573721050432
tuple_a += (5,) # tuple_b = tuple_a + (5, 6, 7)
print(f"더한 후 id: {id(tuple_a)}") # 140573718939184. 다른 id가 찍힌다
print(tuple_a) # (1, 2, 3, 5)
Tip!tupleは新しく生成されたと考えられる.
この場合、追加する要素は1つしかないかもしれません.上のように(5,)で表現するのは、(5)普通のかっこかtuple表現かを区別するのが難しいので、1つの要素しかないときは必ずカンマをつけなければなりません!
tupleの式
tuple図リスト式と同じ方法を使用できます.
いくつか注意事項があるだけです.
list_comp = [i+1 for i in range(10) if i % 2 == 0]
print(list_comp) # [1, 3, 5, 7, 9]
# [] 를 () 로만 치환하면 되겠지?
tuple_comp = (i+1 for i in range(10) if i % 2 == 0)
print(tuple_comp) # <generator object <genexpr> at 0x7fabf6377e40>
なぜ初めて見たジェネレータが現れたのか、後で学ぶ概念なのでpass...要するに、単純カッコはjner layer式になります.
tuple_comp = tuple(i+1 for i in range(10) if i % 2 == 0)
print(tuple_comp) # (1, 3, 5, 7, 9)
map([関数],[ウィジェット])を理解する
ウィジェットで生成された要素を関数に代入し、ウィジェットに戻ります.
# date란 문자열이 있습니다.
# 년 월 일에 해당하는 숫자를 모두 더해 출력하세요
date_str = "2021. 12. 30"
# Case 1. for문 활용하기
total = 0
for i in date_str.split(". "):
total += int(i)
print(total)
# Case 2. map 활용하기
total = sum(map(int, date_str.split(". ")))
print(total)
解説1. .split()で選ばれた2021、12、30文字
2.int関数を代入します.
→ sum( [ int(”2021”), int(”12”), int(”30”) ] )
max(), min(), sum()
リストとチュートリアルを使用できます.
要素の最大値、最小値、合計を求める基本関数を提供します.
list_ = [10, 20, 30, 40, 50]
tuple_ = (20, 10, 40, 30, 50)
max(list_) # 50
min(tuple_) # 10
sum(list_) + sum(tuple_). # 300
Pythonベース関数では,avg()などの平均値を求める関数はない.avg = sum(list)/len(list)
Reference
この問題について(リスト、凡例の整理), 我々は、より多くの情報をここで見つけました https://velog.io/@aiffel-hj/리스트-튜플-정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol