学習者言語の分析(基礎)2 第1回

  • 1.5 変数とデータの型
  • 1.6 データ構造
    • 1.6.1 リスト
    • 1.6.2 内包表記
    • 1.6.3 タプル
    • 1.6.4 セット
    • 1.6.5 ディクショナリ
  • 練習問題

1.5 変数とデータの型¶

多くのプログラミング言語では、変数を使用する前に宣言する必要があり、データの型を指定しなければならないが、Pythonにそのような制約はない。

In [1]:
#変数aに整数の2を代入
a = 2

#変数bに整数の5を代入
b = 5

#変数cにaとbを足したものを代入
c = a + b    

#変数dに少数点以下を含む数値を代入
d = 1.05

#変数eに文字列”Noel”を代入
e = "Noel"

#変数aの型を出力
type(a)      
Out[1]:
int

データの型が異なると演算の意味も異なる。

In [3]:
# 文字列の足し算
x = '1'
y = "6"
z = x + y
z
Out[3]:
'16'
In [4]:
# 算術演算
a += b         # aとbを足した結果をaに代入
a -= b         # aからbをひいた結果をaに代入
a *= b         # aにbをかけけた結果をaに代入
a / b          # aをbでわった結果をaに代入
a ** b         # aのb乗をaに代入
Out[4]:
100000

1.6 データ構造¶

1.6.1 リスト¶

  • リストの基本操作とメソッドを確認します。
In [1]:
L = ["オレンジ", "パパイヤ","マンゴー"]

要素を取り出す

In [2]:
# リスト名[要素番号]
L[1]
Out[2]:
'パパイヤ'
In [3]:
# 複数の要素の場合
L[0:2]
Out[3]:
['オレンジ', 'パパイヤ']

要素の置き換え

In [4]:
L[1] = "ライチ"
L
Out[4]:
['オレンジ', 'ライチ', 'マンゴー']

要素の削除

In [5]:
# del リスト[要素番号]
del L[1]
L
Out[5]:
['オレンジ', 'マンゴー']

リストの連結

In [6]:
# リスト + リスト
M = ["キャベツ","トマト","カリフラワー"]
L + M # 保存されない
Out[6]:
['オレンジ', 'マンゴー', 'キャベツ', 'トマト', 'カリフラワー']

要素の追加

In [14]:
# リスト.append(注: 複数要素はappendできない)
A = ["ライオン","カバ","キリン"]
A.append("ゾウ")
A
Out[14]:
['ライオン', 'カバ', 'キリン', 'ゾウ']

リストへリストを追加する

In [15]:
B = ["クジラ","イルカ"]
A.extend(B)
A
Out[15]:
['ライオン', 'カバ', 'キリン', 'ゾウ', 'クジラ', 'イルカ']

要素の挿入

In [16]:
# リスト.insert(位置, 追加する要素)
A.insert(1,"オカピ")
A
Out[16]:
['ライオン', 'オカピ', 'カバ', 'キリン', 'ゾウ', 'クジラ', 'イルカ']

要素の削除

In [17]:
# 要素を指定して削除
A.remove("カバ")
A
Out[17]:
['ライオン', 'オカピ', 'キリン', 'ゾウ', 'クジラ', 'イルカ']
In [18]:
# 要素番号を指定して削除
del A[0]
A
Out[18]:
['オカピ', 'キリン', 'ゾウ', 'クジラ', 'イルカ']
In [19]:
# 指定した要素番号の要素を削除して出力
A.pop(-1)
Out[19]:
'イルカ'

要素番号の取得

In [20]:
A.index("ゾウ")
Out[20]:
2

要素の存在確認

In [21]:
"キリン" in A
Out[21]:
True

要素の並べ替え

In [23]:
S = ["India","Hotel","Fox","Delta","Alpha","Charie","Bravo","Echo","Golf"]
In [24]:
# 非破壊
sorted(S)
Out[24]:
['Alpha', 'Bravo', 'Charie', 'Delta', 'Echo', 'Fox', 'Golf', 'Hotel', 'India']
In [25]:
S
Out[25]:
['India', 'Hotel', 'Fox', 'Delta', 'Alpha', 'Charie', 'Bravo', 'Echo', 'Golf']
In [26]:
# 破壊
S.sort()
In [27]:
S
Out[27]:
['Alpha', 'Bravo', 'Charie', 'Delta', 'Echo', 'Fox', 'Golf', 'Hotel', 'India']

emumerate

In [16]:
# 要素の順番と値を返す

L = [10,25,30]

for i, v in enumerate(L):
    print(i,v)
0 10
1 25
2 30
In [17]:
# range関数
#0からn-1の整数列
r = range(5)
list(r)
Out[17]:
[0, 1, 2, 3, 4]

1.6.2 内包表記¶

リストや辞書などのループ処理を短く書く記法。

In [20]:
# forで書くと
L = ["pen","apple","grape"]
M = []
for i in L:
    M.append(i+"s")
M
Out[20]:
['pens', 'apples', 'grapes']
In [21]:
L = ["pen","apple","grape"]
N = [i + "s" for i in L]
N
Out[21]:
['pens', 'apples', 'grapes']
In [22]:
# Lの中の単語でXにある単語だけPに保存

L = ["pen","apple","book"]
X = ["pen","eraser","book","pencil"]

P = [i for i in L if i in X]
P
Out[22]:
['pen', 'book']
In [36]:
(10**10-1)/9
Out[36]:
1111111111.0

1.6.3 タプル¶

タプルとは()で括った構造。リストと似ているが、1度作ったタプルは変更できない。

In [5]:
T = (1,2,3,4,5)  
In [6]:
T.append(6)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-ecbdb13d2d18> in <module>
----> 1 T.append(6)

AttributeError: 'tuple' object has no attribute 'append'

1.6.4 セット¶

順番が保持さない、重複要素が削除されるリスト

In [7]:
S = set([1,2,2,2,4,4,5])
S
Out[7]:
{1, 2, 4, 5}
In [8]:
# 要素の追加
S.add(9)
S
Out[8]:
{1, 2, 4, 5, 9}
In [58]:
# 和集合1
A = {1,2,3}
B = {3,4,5}
A | B
Out[58]:
{1, 2, 3, 4, 5}
In [56]:
# 和集合2
D = {1,2,3}
E = {3,4,5}

D.union(E)
Out[56]:
{1, 2, 3, 4, 5}
In [57]:
# 積集合1
A & B
Out[57]:
{3}
In [59]:
A.intersection(B)
Out[59]:
{3}
In [61]:
# 差集合1
A - B
Out[61]:
{1, 2}
In [62]:
# 差集合2
A.difference(B)
Out[62]:
{1, 2}
In [63]:
# 排他的論理和1
A ^ B
Out[63]:
{1, 2, 4, 5}
In [64]:
# 排他的論理和2
A.symmetric_difference(B)
Out[64]:
{1, 2, 4, 5}

1.6.5 ディクショナリ¶

  • ひとつの要素にキーと値がある。
  • 順番が保持されない。
In [9]:
# ディクショナリの生成
D = {"S001":25,"S002":40,"S003":50}
In [10]:
# 値の取り出し
D["S002"]
Out[10]:
40
In [11]:
# 要素の追加
D["S004"] = 90
In [12]:
# keyの取得
D.keys()
Out[12]:
dict_keys(['S001', 'S002', 'S003', 'S004'])
In [13]:
# 値の取得
D.values()
Out[13]:
dict_values([25, 40, 50, 90])
In [14]:
# 以下のようにすると全ての値が取得できる

for i in D.keys():
    print(D[i])
25
40
50
90
In [15]:
# 両方同時に
for k,v in D.items():
    print(k,v)

# 順番は保持されない
S001 25
S002 40
S003 50
S004 90

練習問題¶

1, 11, 111,1111のようにすべての桁の数字が1である自然数をレピュニット(数)と言い、1番目のレピュニットを$R_1 = 1$、2番目を$R_2 = 11$と表します。$R_2$から$R_{10}$までを出力しなさい。

以下のように1を文字列として扱うことはできません。

In [43]:
n = "1"

for i in range(1,11):
    print(n * i)
1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111