home changes contents help options

108:配列を連結する

リストを単に連結するならば + 演算子を使用します。

>>> array1 = ['Perl','Python','Ruby']
>>> array2 = ['Perl','PHP']
>>> array1 + array2
['Perl', 'Python', 'Ruby', 'Perl', 'PHP']

Array#concat のように破壊的につなげるには extend() 関数を使います。

>>> array1.extend(array2)
>>> array1
['Perl', 'Python', 'Ruby', 'Perl', 'PHP']

次に、リストから重複する要素を削除する場合を考えます。こういう状況では各要素の順序を保持する必要があるのかどうか再考してみましょう。順序に意味がない場合は 集合型 の出番です。置き換えてしまいましょう。集合同士になってしまえば、あとは | 演算子、もしくは union メソッドで和集合を作成するだけです。

>>> array1 = ['Perl','Python','Ruby']
>>> array2 = ['Perl','PHP']
>>> set1 = set(array1)
>>> set2 = set(array2)
>>> set1 | set2
set(['Python', 'PHP', 'Ruby', 'Perl'])

順序を保持しつつ重複を削除する場合は一工夫いります。 Array#| に相当するものが無いからです。次の union 関数は、補助用の集合 ret_s にて重複要素を判定しつつ、連結されたリスト ret リストを構築します。

>>> def union(*sequences):
...   ret = []
...   ret_s = set()
...   for sequence in sequences:
...     for item in sequence:
...       if item not in ret_s:
...         ret.append(item)
...         ret_s.add(item)
...   return ret
...
>>> union(array1, array2)
['Perl', 'Python', 'Ruby', 'PHP']