2012年5月14日月曜日

初めてのコンピュータサイエンス第5章解答

第5章の解答を上げます。以下ネタバレなので、読みたくない方は立ち去りましょう。問題文は載せませんので悪しからず。必要なら買いましょう。その前にこの章の個人的なメモ。

  • リストはミュータブル(書き換え可能)であるのに対し、数値や文字列はイミュータブル(書き換えできない)である。
  • リストではエイリアシングによるエラーに注意。エイリアシングとは違う変数名が同じオブジェクトを指すことである。数値や文字列オブジェクトではエイリアシングはない。
  • リストメソッドは新しいリストを生成しない。また、popメソッドを除き、リストに関連するメソッドの返り値はNoneになる。
  • 1個の要素を持つタプル(イミュータブルなシーケンス)は(data, )のように","をつける必要がある。

1~4

>>> alkaline_earth_metals = [4, 12, 20, 38, 56, 88] # 1の解答
>>> alkaline_earth_metals[5] # 2の解答
88
>>> alkaline_earth_metals[-1]
88
>>> len(alkaline_earth_metals) # 3の解答
6
>>> max(alkaline_earth_metals) # 4の解答
88

5

改行かスペースかという違いがある。すなわちprint aは改行せず、print a,はスペースを入れる。

6

問題文には「5.5 スライシング」のhalf_livesリストとあるが、正しくは「5.3 リストの組み込み関数」と思われる。

>>> half_lives = [87.74, 24110.0, 6537.0, 14.4, 376000.0]
>>> for val in half_lives:
...     print val
... 
87.74
24110.0
6537.0
14.4
376000.0

7

>>> for val in half_lives:
...     print val, # ,を入れることで空白区切りで、改行なく出力する
... 
87.74 24110.0 6537.0 14.4 376000.0

8

country_populations = [1295, 23, 7, 3, 47, 21]
total = 0
for cp in country_populations:
    total += cp

print total

9~13

temps = [25.2, 16.8, 31.4, 23.9, 28, 22.5, 19.6] # 9の解答
temps.sort() # 10の解答
# 11の解答
cool_temps = [t for t in temps if t < 20] # リスト内包表記を用いている
# cool_temps = temps[:2]とする方法もあるが、一般化した解答を採用した
print cool_temps # tempsはソート済みなので、昇順に表示される
warm_temps = [t for t in temps if t >= 20]
print warm_temps # 上と同じくソート済みで表示される
temps_in_celsius = cool_temps + warm_temps # 12の解答
temps_in_fahrenheit = [] # 以下13の解答
for cels in temps_in_celsius:
    fahr = cels * 1.8 + 32
    temps_in_fahrenheit.append(fahr)

14~16

# 14の解答
alkaline_earth_metals = [[4, 9.012], [12, 24.305], [20, 40.078], \
 [38, 87.62], [56, 137.327], [88, 226]]
print alkaline_earth_metals
# 15の解答
for elem in alkaline_earth_metals:
    print elem[0], elem[1]
# 16の解答
number_and_weight = []
for elem in alkaline_earth_metals:
    number_and_weight.append(elem[0])
    number_and_weight.append(elem[1])
print number_and_weight

17

f = open('alkaline_metals.txt', 'r')
number_and_weight = []
for line in f:
    elems = line.split()
    number_and_weight.append([elems[0], elems[1]])

print number_and_weight

18

valuesに[0, 1, 2]という値が設定された後、values[1] = valuesによって、1という要素が[0, 1, 2]に差し替えられる。リストはミュータブルなので、値が書き換えられ、結局[0, [0, 1,2], 2]というリストになる。

19

def mystery_function(values):
    ''' 各リストのn番目の要素をn番目のリストの要素にする
        リストの要素数が不変でn*mの長方形型であれば、
        転置に相当する操作が行われる
    '''
    result = []
    for i in range(len(values[0])):
        result.append([values[0][i]]) # 先頭は一列目の値
        for j in range(1, len(values)):
            # result[-1]は上でappendしたもの。
            # i列目のj番目の要素を順にリストに追加する
            result[-1].append(values[j][i])
    return result

20

ミュータブルな文字列あったとき、例えば途中の文字を大文字に変換するといった操作は、便利であろう。イミュータブルにしている理由としては、文字列の生成時にメモリの割り当てを固定できるという点である。これによりパフォーマンスの向上が期待できる(www.python.jpのオフィシャルサイトにそのような記述がある)。

21

ソートするとNoneが返される。文字列と数字を比較すること自体に意味はない(Javaなどのchar型と比較するのは意味があるといえなくも無いですが...)。例えば3章の文字列の規則と照らし合わせ、'123' - 4は何かと問われると、定義する方法がないことに気づかされる('123'+(-4)の'+'は文字列として結合するか、足し算とみなすかで曖昧さが発生してしまう。Python側で勝手な処理をするとエラーの捕捉が難しくなってしまう)。返り値がNoneであればエラー処理をせよという考え方もできるので、Pythonの動作としては、このままでもよいものと思われる。

>>> ret = [1, 'a', 2, 'b'].sort()
>>> print ret
None

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計