Chapter2: 制御とデータ構造

  1. 制御
  2. 標準的なデータ構造
    1. 文字列
    2. リスト
    3. 辞書
  3. 練習問題

2-1. 制御

ループ

N = 10 # 繰り返す回数
for i in range(N):
    # 繰り返す処理

while 条件:
    # 条件が成立するときの処理

条件分岐

if 条件1:
    # 条件1が成立しているときの処理
elif 条件2:
    # 条件1が成立せず,条件2が成立するときの処理
else:
    # 条件1も条件2も成立しないときの処理

2-2. 標準的なデータ構造

2-2-1. 文字列


In [1]:
s = 'Hello'
print(s[1]) # indexを指定して,表示する
print(len(s)) # 文字列sの長さを表示する
print(s+' world') # 文字列を連結する


e
5
Hello world

In [2]:
s + 1.5 # 文字列と数値の和をとることはできない


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-46c1288cdcdd> in <module>()
----> 1 s + 1.5 # 文字列と数値の和をとることはできない

TypeError: Can't convert 'float' object to str implicitly

In [3]:
s + str(1.5) # キャストすることで連結ができる


Out[3]:
'Hello1.5'

In [4]:
print(s.upper()) # すべて大文字にする
print(s.lower()) # すべて小文字にする
print(s[1:]) # 部分文字列


HELLO
hello
ello

In [5]:
text = """I never think of the future. 
It comes soon enough."""
# このように文字列を定義すると複数行でも扱える
print(text)


I never think of the future. 
It comes soon enough.

In [6]:
print(text.split(' '))# スペースで分割する


['I', 'never', 'think', 'of', 'the', 'future.', '\nIt', 'comes', 'soon', 'enough.']

2-2-2. リスト


In [7]:
countries = ['USA', 'UK', 'Japan']
for i in range(3):
    print(countries[i]) # indexを指定して値を表示

for country in countries:
    print(country) # リストの要素を引き出すことができる


USA
UK
Japan
USA
UK
Japan

In [8]:
print(len(countries)) # リストの長さ
if 'USA' in countries: # 'USA'がcountriesの中にある場合
    print('OK') 
else:
    print('NG')


3
OK

リストのメソッド

  • append
  • sort
  • remove

In [9]:
countries = ['USA', 'UK', 'Japan']
countries.append('China') # リストに追加
print(countries)
print(countries.index('UK')) # indexを求める
print(countries[1:-1]) # 部分リストを表示

countries.sort() # 辞書順にソート
print(countries)

countries.remove('UK') # リストにある値を消去
print(countries)


['USA', 'UK', 'Japan', 'China']
1
['UK', 'Japan']
['China', 'Japan', 'UK', 'USA']
['China', 'Japan', 'USA']

内包表現

array = [i for i in range(N)] # 0からN-1までのリストを作る

In [10]:
array = [i for i in range(10)]
print("0から9までのリスト: ", array)

odd_array = [x for x in array if x%2 != 0]
print("奇数のリスト: ", odd_array)


0から9までのリスト:  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
奇数のリスト:  [1, 3, 5, 7, 9]

注意点: 参照渡しと値渡し

リストの値が渡されるのではなく,参照が渡される.
コピーする時は気をつけてコピーする必要がある.

参考資料: Pythonでリストの深いコピー


In [11]:
b = countries # 参照をコピーする
b.pop() # bにのみ変更を加える
print(b)
print(countries) # countriesにも影響がある


['China', 'Japan']
['China', 'Japan']

In [12]:
a = countries[:] # 参照ではなく,値をコピーする
a.pop() # aにのみ変更を加える
print(a)
print(countries)


['China']
['China', 'Japan']

In [13]:
# 深いコピーの例
import copy
obj = [{'a': 10}]
deepcopied = copy.deepcopy(obj)
print('obj   :', id(obj[0]))
print('copied:', id(deepcopied[0]))


obj   : 4536566472
copied: 4536551816

2-2-3. 辞書

Pythonにおける連想配列を「辞書」と呼ぶ.
keyとvalueをペアにして保存するデータ構造である.


In [14]:
d = {}
d['a'] = 'art' # dict[key] = value という形で辞書に追加
d['b'] = 'beam'
d['c'] = 'circuit'
print(d)


{'a': 'art', 'c': 'circuit', 'b': 'beam'}

In [15]:
print(d.get('a')) # dからkeyが'a'となるものを取り出す
print(d['a']) # dからkeyが'a'となるものを取り出す(2)


art
art

In [16]:
print(d.keys()) # keyのリスト
print(d.values()) # valueのリスト


dict_keys(['a', 'c', 'b'])
dict_values(['art', 'circuit', 'beam'])

In [17]:
for key, value in d.items():
    print(key + ':' + value)


a:art
c:circuit
b:beam

In [18]:
del d['b'] # keyが'b'となるエントリを消す
print(d)


{'a': 'art', 'c': 'circuit'}