「python」カテゴリーアーカイブ

リスト、タプル、集合、辞書のオブジェクトの種類を相互に変換する方法

リスト、タプル、集合、辞書のオブジェクトの相互変換のイメージ図

はじめに

 本ページでは、リスト(list)、タプル(tuple)、集合(set)、辞書(dict)の4種類のオブジェクトについて、オブジェクトの種類を相互に変換する方法を説明します。
 なお、集合は重複した要素を持たせられないこと、辞書は1つの要素がkeyとvalueの組み合わせで重複したkeyは設定できないことに留意して変換する必要があります。

タプル、集合、辞書からリストへの変換

>>> tup = ('A', 'B', 'C')
>>> list(tup)          # タプル -> リスト
['A', 'B', 'C']
>>>
>>> st = {'A', 'B', 'C'}
>>> list(st)           # 集合 -> リスト
['C', 'B', 'A']
>>>
>>> dic = {1:'A', 2:'B', 3:'C'}
>>> list(dic.keys())   # 辞書のkey -> リスト
[1, 2, 3]
>>> list(dic.values()) # 辞書のvalue -> リスト
['A', 'B', 'C']
>>> list(dic.items())  # 辞書の(key,value)のタプル->リスト
[(1, 'A'), (2, 'B'), (3, 'C')]
 タプル、集合、辞書からリストへ変換するには、list関数を使います。
 辞書については、各要素がkeyとvalueの組み合わせなので、keyかvalueのいずれか1つをリスト化する方法と、(key,value)の組み合わせのタプルをリスト化する方法とがあります。

リスト、集合、辞書からタプルへの変換

>>> lst = ['A', 'B', 'C']
>>> tuple(lst)          # リスト -> タプル
('A', 'B', 'C')
>>>
>>> st = {'A', 'B', 'C'}
>>> tuple(st)           # 集合 -> タプル
('C', 'B', 'A')
>>>
>>> dic = {1:'A', 2:'B', 3:'C'}
>>> tuple(dic.keys())   # 辞書のkey -> タプル
(1, 2, 3)
>>> tuple(dic.values()) # 辞書のvalue -> タプル
('A', 'B', 'C')
>>> tuple(dic.items())  # 辞書の(key,value)のタプル->タプル
((1, 'A'), (2, 'B'), (3, 'C'))
 リスト、集合、辞書からタプルへ変換するには、tuple関数を使います。
 リストへの変換の場合との違いは、使う関数が異なる点のみです。

リスト、タプル、辞書から集合への変換

>>> lst = ['A', 'B', 'C', 'A']
>>> set(lst)            # リスト -> 集合
{'C', 'B', 'A'}
>>>
>>> tup = ('A', 'B', 'C', 'A')
>>> set(tup)            # タプル -> 集合
{'C', 'B', 'A'}
>>>
>>> dic = {1:'A', 2:'B', 3:'C', 4:'A'}
>>> set(dic.keys())     # 辞書のkey -> 集合
{1, 2, 3, 4}
>>> set(dic.values())   # 辞書のvalue -> 集合
{'C', 'B', 'A'}
>>> set(dic.items())    # 辞書の(key,value)のタプル->集合
{(3, 'C'), (1, 'A'), (4, 'A'), (2, 'B')}
 リスト、タプル、辞書から集合へ変換するには、set関数を使います。
 なお、集合は重複した要素を持つことができないので、注意が必要です。上記の例では、リスト、タプル、辞書(value)に'A'という要素を2つ設定していますが、集合に変換すると1つに減っていることが分かります。
 辞書のkeyと(key,value)のタプルについては重複することはありませんので、集合に変換しても要素数が減ることはありません。

リスト、タプル、集合から辞書へ変換

dict関数の使い方

>>> lst = [(1, 'A'), (2, 'B'), (3, 'C')]
>>> dict(lst)
{1: 'A', 2: 'B', 3: 'C'}
 リスト、タプル、集合から辞書へ変換するには、dict関数を使います。
 辞書はkeyとvalueの組み合わせが必要なのでリスト、タプル、集合へと変換する場合とは少し勝手が違います。
 下記の例の様にdict関数を使う場合は、リストなどの各要素をkeyとvalueの組み合わせのタプルにします。

リスト、タプル、集合の要素を辞書のkey、同一の初期値をvalueとした辞書の作成

>>> lst = ['A', 'B', 'C', 'A']
>>> dict.fromkeys(lst, 0)      # リスト -> 辞書
{'A': 0, 'B': 0, 'C': 0}
>>>
>>> tup = ('A', 'B', 'C', 'A')
>>> dict.fromkeys(tup, 0)      # タプル -> 辞書
{'A': 0, 'B': 0, 'C': 0}
>>>
>>> st = {'A', 'B', 'C'}
>>> dict.fromkeys(st, 0)       # 集合 -> 辞書
{'C': 0, 'B': 0, 'A': 0}
 リスト等の要素をkeyとする辞書を作成し、valueは後で設定したいという場合もあります。その場合、辞書のfromkeys関数を使用することにより、第1引数で渡したリストなどの要素をkeyとし、第2引数で指定した値をvalueとした辞書を作成することができます。
 なお、辞書のkeyには重複したものを使用できませんので、重複した要素については自動的に1つのkeyとなります。この例ではリストとタプルに'A'という要素が2つありますが、作成された辞書のkeyには'A'は1つしか無いことが分かります。

リスト、タプル、集合の要素を辞書のvalue、0から始まる整数列をkeyとした辞書の作成

>>> # リスト -> 辞書
>>> lst = ['A', 'B', 'C']
>>> dict([(i, e) for i, e in enumerate(lst)])
{0: 'A', 1: 'B', 2: 'C'}
>>>
>>> # タプル -> 辞書
>>> tup = ('A', 'B', 'C')
>>> dict([(i, e) for i, e in enumerate(tup)])
{0: 'A', 1: 'B', 2: 'C'}
>>>
>>> # 集合 -> 辞書
>>> st = {'A', 'B', 'C'}
>>> dict([(i, e) for i, e in enumerate(st)])
{0: 'C', 1: 'B', 2: 'A'}
 ここでは、keyとvalueの組み合わせのタプルのリストを作り、dict関数に引数として渡して辞書を作っています。

関連項目

関数dict.items, keys, valuesの使い方の例
関数dict.fromkeysの使い方の例

多次元リストの合計値などの計算方法

はじめに

多次元・不整形なリストの例
 本ページでは、上図のように多次元で不整形なリストの合計値などを求める方法を説明します。
 数値のみが入ったPythonのリストであればsum関数で合計値を求めたり、max関数で最大値を求めることができますが、リストの中にリストが入った2次元や3次元のリストの合計値などを直接計算できる関数はありません。では、ではどうすれば良いのでしょうか。

1次元のリストに変換することを考える

 まず、目的のリストを1次元に変換することを考えます。1次元に変換すればsumやmaxといった関数が使用できるからです。

1次元化の関数を作る

def flatten(c:'list, tuple, set') -> list:
    """多次元のリスト、タプル、集合を1次元化したリストを返却"""
    lst = []
    for e in c:
        if type(e) in (list, tuple, set):
            lst += flatten(e)
        else:
            lst += [e]
    return lst
 この関数の引数にリストを渡すと、要素を走査しながらリストを作り直します。途中でリストの要素を見つけると、関数を再帰呼び出しして、1次元化するよう依頼します。そして、再帰呼び出しした関数から返却された1次元のリストを作成中のリストに加えます。このようにして1次元のリストを完成させます。
 なお、この関数はリストだけではなくタプルや集合、あるいは、それらの混ざったものであっても機能します。

合計値などの計算例

>>> lst = [[3, 1, 8, 5],
          [9, 4, [3, 8]],
          [[6,3]],
          [8, 7]]
>>> lst_flat = flatten(lst)
>>> lst_flat
[3, 1, 8, 5, 9, 4, 3, 8, 6, 3, 8, 7]
>>> sum(lst_flat) # 合計値
65
>>> max(lst_flat) # 最大値
9
>>> min(lst_flat) # 最小値
1
>>> sum(lst_flat)/len(lst_flat) # 平均値
5.416666666666667
 このようにして、上図に示した多次元で不整形なリストの合計値、最大値の他、最小値や平均値も求めることができました。

関連項目

リスト(list)の生成方法、演算子、関数

関数dict.updateの使い方の例

関数の機能

別の辞書によって辞書を更新する。

D.update(E)
  D, E : 辞書のオブジェクト

上記の様に書くと、辞書Eによって辞書Dが下記の様に更新されます。
・DとEの両方に存在するkey : Eのvalueに変更
・Eにのみ存在するkey : Eの要素をDに追加
・Dにのみ存在するkey : 変化なし

>>> D = {1:'A', 2:'B', 3:'C'}
>>> E = {3:'G', 4:'Y'}
>>> D.update(E)
>>> D
{1: 'A', 2: 'B', 3: 'G', 4: 'Y'}
この例では、辞書Eによって辞書Dを下記のように更新しています。
  1と2のkey : Eには無いので変化なし
  3のkey : DとEの両方に存在するのでEのvalue('G')に変更
  4のkey : Dには無いので追加

関数dict.popitemの使い方の例

関数の機能:辞書から要素を1つ取り出し、取り出した要素は削除する。取り出す順は後入れ先出し法。返却値は(key, value)のタプル。

1つの要素を取り出す

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.popitem()
(3, 'C')
>>> D
{1: 'A', 2: 'B'}
この例では、3つの要素の辞書から関数popitemを使って1つの要素を取り出しています。関数の実行後に辞書の内容を確認すると、取り出した要素が削除されていることが分かります。

要素が1つも無い辞書に関数を使った場合

>>> D = {}
>>> D.popitem()
Traceback (most recent call last):
...
KeyError: 'popitem(): dictionary is empty'
要素が1つも無いの辞書に関数を使うとエラーが発生します。

順番 = 後入れ先出し法(Last In First Out)

>>> D = {}
>>> D[0] = 'P'
>>> D[1] = 'y'
>>> D[2] = 't'
>>> D[3] = 'h'
>>> D[4] = 'o'
>>> D[5] = 'n'
>>> D.popitem()
(5, 'n')
>>> D.popitem()
(4, 'o')
>>> D.popitem()
(3, 'h')
>>> D.popitem()
(2, 't')
>>> D.popitem()
(1, 'y')
>>> D.popitem()
(0, 'P')
関数popitemを使うと、後に追加した要素から順に取り出されます。

関連項目

関数dict.clearの使い方の例
関数dict.popの使い方の例

関数dict.setdefaultの使い方の例

関数の機能:
  keyを指定してdafault値がvalueの要素を辞書に追加する。
  但し、指定したkeyが辞書に存在すれば要素は追加されない。

辞書に存在するkeyを指定した場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.setdefault(1)
'A'
>>> D
{1: 'A', 2: 'B', 3: 'C'}
この例では、辞書に存在するkeyを指定(ここでは1を指定)して関数を呼び出しています。この場合、関数からの返却値は指定したkeyに対応するvalue(ここでは'A')となります。また、辞書に変化は生じません。

辞書に存在しないkeyを指定した場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.setdefault(4)
>>> D
{1: 'A', 2: 'B', 3: 'C', 4: None}
この例では、辞書に存在しないkeyを指定(ここでは4)して関数を呼び出しています。この場合、指定したkeyの要素が追加され、valueはdefault値(指定しなければNone)となります。
default値を指定する場合は下記の様に、2番目の引数に指定します。
>>> D.setdefault(5, 'X')
'X'
>>> D
{1: 'A', 2: 'B', 3: 'C', 4: None, 5: 'X'}

関数dict.popの使い方の例

関数の機能:keyを指定して辞書から要素を1つ取り出し、取り出した要素は削除する。返却値はkeyに対応するvalue。

辞書に存在するkeyを指定した場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.pop(1)
'A'
>>> D
{2: 'B', 3: 'C'}
この例では、関数の引数として1のkeyを指定し、関数から'A'のvalueが返却されています。関数の実行後に辞書Dの内容を確認すると1のkeyの要素が無くなっていることが分かります。

辞書に存在しないkeyを指定した場合

defaultを設定した場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.pop(4, 'X')
'X'
2番目の引数にdefaultを設定(ここでは'X')し、辞書に存在しないkeyを指定するとdefaultが返却されます。

defaultを設定しない場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.pop(5)
Traceback (most recent call last):
...
KeyError: 5
defaultを設定せずに辞書に存在しないkeyを指定するとエラーが発生します。

関連項目

関数dict.clearの使い方の例
関数dict.getの使い方の例
関数dict.popitemの使い方の例

関数dict.items, keys, valuesの使い方の例

関数の機能
  items  : 辞書のkeyとvalueのビューを提供するオブジェクトを返却
  keys   : 辞書のkeyのビューを提供するオブジェクトを返却
  values : 辞書のvalueのビューを提供するオブジェクトを返却

itemsの使い方の例

>>> D = {1:'A', 2:'B', 3:'C'}
>>> DI = D.items()
>>> DI
dict_items([(1, 'A'), (2, 'B'), (3, 'C')])
関数itemsを使うと、辞書のkeyとvalueのタプルを並べた配列のようなオブジェクトが作成されます。
この例ではそのオブジェクトにDIという名前を付けており、DIはDのビューなので、下記のようにDを変更してからDIの内容を再確認すると内容が変わっていることが分かります。
>>> D[4] = 'D'
>>> DI
dict_items([(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')])
list関数を使えば、keyとvalueのタプルのリストを作ることができます。
>>> list(DI)
[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')]

keysの使い方の例

>>> D = {1:'A', 2:'B', 3:'C'}
>>> DK = D.keys()
>>> DK
dict_keys([1, 2, 3])
関数keysを使うと、辞書のkeyを並べた配列のようなオブジェクトが作成されます。

valuesの使い方の例

>>> D = {1:'A', 2:'B', 3:'C'}
>>> DV = D.values()
>>> DV
dict_values(['A', 'B', 'C'])
関数valuesを使うと、辞書のvalueを並べた配列のようなオブジェクトが作成されます。

関数dict.getの使い方の例

関数の機能:
  指定したkeyが辞書に有る場合はそれに対応するvalueを返却する
  無い場合はNone(又は指定した値)を返却する

指定したkeyが辞書にある場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> D.get(3)
'C'
keyが辞書に有る場合は、そのkeyに対応するvalueが返却されます。
この例では、指定したkeyは3、それに対応するvalueは'C'です。
keyがある場合には、下記の様にインデックス演算子でvalueを取り出すのと同じ結果となります。
>>> D[3]
'C'

指定したkeyが辞書に無い場合

>>> D = {1:'A', 2:'B', 3:'C'}
>>> print(D.get(4))
None
>>> D.get(4, 'キーが無い')
'キーが無い'
この例では、4という辞書に無いkeyを指定しています。
このように指定したkeyが辞書に無い場合は、None又は第2引数に指定した値が返却されます。

関連項目

関数dict.popの使い方の例

関数dict.fromkeysの使い方の例

関数の機能:新しい辞書を作成
 key   : iterableオブジェクトで複数個を指定する。
 value : 1つのオブジェクトを指定する。(全て同じvalueとなる)

keyが整数、valueがNoneの辞書を作成

>>> dict.fromkeys(range(10), None)
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
この例では、range関数を使用して0〜9までの整数をkeyとして指定しています。

keyがアルファベット、valueが0の辞書を作成

dict.fromkeys('abcdefghijklmn', 0)
{'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0}
この例では、文字列オブジェクトを使用してa〜nまでのアルファベット1文字をkeyとして指定しています。

関連項目

工事中

関数dict.copyの使い方の例

関数の機能:辞書の浅いコピーを作成する

>>> D1 = {1:'A', 2:'B', 3:'C'}
>>> D2 = D1.copy()
>>> D2
{1: 'A', 2: 'B', 3: 'C'}
copy関数によりD2という辞書が新たに生成されました。
下記のように、D2を変更してもD1は変化しません。
>>> D2[1] = 'G'
>>> D2
{1: 'G', 2: 'B', 3: 'C'}
>>> D1
{1: 'A', 2: 'B', 3: 'C'}