Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Python list

Pythonのリストの各要素に関数を適用して新しいリストを作るいくつかの方法

Pythonのリストの各要素に関数を適用して要素を変更したリストを作る方法の解説

Pythonのプログラミング中に、すでになんらかのリストを作っていて、そのリストの中身を変更した新しいリストを作りたいときがあると思います。

今回はそのような、リストの各要素を変更して、それらの要素を使った新しいリストを作る方法をいくつか紹介します。あくまでいくつか、というだけで全てではありません。ここで紹介する方法以外でもできます。

はじめに:既存のリストの中身を変更するだけ

####参考
original_list = [0, 1, 2, 3]
for i in original_list:
    original_list[i]=i**2
print(original_list)

結果は、

[0, 1, 4, 9]

既存のリストの中身の数字を全て2乗した数字によって、もとのリストを書き換えるものです。

方法その1: 単純に組み込みメソッドappend()だけを利用

####方法1-1
new_list = []
original_list = [0, 1, 2, 3]

for i in original_list:
    new_list.append(i**2)

print(new_list)

結果は、

[0, 1, 4, 9]

また同じことを定義した関数を使って書くと、

####方法1-2
def fnc(x):
    x = i**2
    return x

new_list = []
for i in original_list:
    y = fnc(i)
    new_list.append(y)
    
print(new_list)

となります。もちろん結果は、

[0, 1, 4, 9]

方法その2: 内包表記を利用

####方法2
original_list = [0, 1, 2, 3]
new_list= [i**2 for i in original_list]
print(new_list)

結果は、

[0, 1, 4, 9]

このリストの内包表記については、次の記事で解説する記事を作ってありますので、そちらをご覧ください。

方法3: map関数を利用

map関数 + ラムダ関数

####方法4
original_list = [0, 1, 2, 3]
new_list = list(map(lambda i:  i**2, original_list))
print(new_list)

結果は、

[0, 1, 4, 9]

組み込み関数の1つmap関数は、その第1引数に指定された関数を、第2引数のイテラブルオブジェクトの各要素に1回ずつ適用し、その結果によって構成されるイテレータを返します。

上のコードでは、無名関数lamda(ラムダ関数)が、original_listの各要素に適用され、その結果からなるイテレータオブジェクトを作成されます。そのイテレータオブジェクトを使い、組み込み関数のlist関数を使って、新しいリストが生成されます。

同じことをラムダ関数ではなく、普通の関数を定義して使って書き直すとこうなります。

map関数 + 普通の関数

def fnc(i):
    x = i**2
    return x
original_list = [0, 1, 2, 3]
new_list = list(map(fnc, original_list))
print(new_list)

こちらも結果は同じく、

[0, 1, 4, 9]

イテラブルとイテレータについてはこちらの記事を読んでみてください。

方法4: itertoolsモジュールの利用

####方法4
import itertools

original_list = [(0, 1, 2, 3)]

def fnc(*args):
    new_list = []
    for a in args:
        a = a**2
        new_list.append(a)
    return new_list

list(itertools.starmap(fnc, original_list))

この方法は、map関数の拡張版のようなモジュールの、itertoolsモジュールを使ったものです。

実はこれを実行すると、これまでのコードとは異なる結果となります。すなわち、

[[0, 1, 4, 9]]

という結果となります。違いがわかるでしょうか。2重リストになっている点が異なります。

[0, 1, 4, 9]  # これまでのコードの結果

[[0, 1, 4, 9]]  #itertoolsを使った場合の結果

この点に注意してください。

なお、このitertoolsモジュールを使った方法では、次のようにoriginal_listの中身を複数個にもできます。

# original_list = [(0, 1, 2, 3)]から変更。リストの中身を2つのタプルへ
original_list = [(0, 1, 2, 3), (4, 5)]

def fnc(*args):
    new_list = []
    for a in args:
        a = a**2
        new_list.append(a)
    return new_list


list(itertools.starmap(fnc, original_list))

こうすると結果は、

[[0, 1, 4, 9], [16, 25]]

もともとのリストの要素だった、(0, 1, 2, 3)というタプルと、(4, 5)というタプルの2つについて、それぞれ変更が加えられたものができあがっています。

このコードで使っている、

  • *args
  • itertoolsモジュール

これらについては、次の解説記事も読んでみてください。

以上、簡素な内容でしたが、Pythonのリストについてその中身を変更したリストを作る方法の例の紹介でした。もちろん今回紹介した方法以外にも方法は複数あるので、みなさんもいろいろ試してみてください。

なおPython学習には世界最大規模の動画学習サイトUdemyでの動画講座がおすすめです。やはり動画だと実際の動きなどがわかりやすいので、より短時間でPythonを習得できます。次のような人気講座があります。