Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python入門】リスト内の各要素を繰り返し複製する3つの方法

Pythonでプログラミングをしていると、リスト内の各要素を繰り返し(複製して)新しいリストを作成したい場面があります。例えば、データの水増しやテスト用データの生成などがその一例です。本記事では、リストの要素をそれぞれ2回ずつ繰り返した新しいリストを作成する方法を、3つのアプローチに分けてわかりやすく解説します。

方法1:ネストしたforループ(リスト内包表記)を使う

最もシンプルで直感的な方法は、リスト内包表記にforループを組み合わせるやり方です。各要素に対して内側のループで2回出力することで、元の要素とその複製を順番に並べた新しいリストを生成できます。

サンプルコード

# 元のリスト
listA = ['Mon', 'Tue', 9, 3, 3]

print("Given list : ", listA)

# 各要素を2回繰り返して新しいリストを作成
Newlist = [i for i in listA for n in (0, 1)]

# 結果を表示
print("New list after duplication: ", Newlist)

実行結果

上記のコードを実行すると、以下の出力が得られます。

Given list : ['Mon', 'Tue', 9, 3, 3]
New list after duplication: ['Mon', 'Mon', 'Tue', 'Tue', 9, 9, 3, 3, 3, 3]

ポイントは for n in (0, 1) の部分です。タプル (0, 1) を使うことで、各要素が必ず2回出力される仕組みになっています。繰り返し回数を変えたい場合は、この部分を (0, 1, 2) のように変更すれば3回以上の複製も可能です。

方法2:itertoolsモジュールを使う

標準ライブラリの itertools モジュールは、イテラブル(反復可能オブジェクト)の操作に特化した便利なツール群を提供しています。ここでは chain.from_iterable() を活用します。この関数は、入れ子になったイテラブルを平坦化して1つの連続したイテレータにまとめる働きがあります。

サンプルコード

import itertools

# 元のリスト
listA = ['Mon', 'Tue', 9, 3, 3]

print("Given list : ", listA)

# 各要素を2回繰り返して新しいリストを作成
Newlist = list(itertools.chain.from_iterable([n, n] for n in listA))

# 結果を表示
print("New list after duplication: ", Newlist)

実行結果

上記のコードを実行すると、以下の出力が得られます。

Given list : ['Mon', 'Tue', 9, 3, 3]
New list after duplication: ['Mon', 'Mon', 'Tue', 'Tue', 9, 9, 3, 3, 3, 3]

ジェネレータ式 [n, n] for n in listA で各要素を2つ並べたリストを作り、それを chain.from_iterable() で平坦化しています。大量のデータを扱う場合でもメモリ効率が良いのが特徴です。

方法3:reduce関数を使う

functools.reduce() 関数は、第2引数として渡されたリストの全要素に対して、第1引数で指定した関数を順番に適用していきます。ここでは operator.add(加算・連結を行う関数)と組み合わせることで、各要素の複製を次々と連結し、1つのリストにまとめます。

サンプルコード

from functools import reduce
from operator import add

# 元のリスト
listA = ['Mon', 'Tue', 9, 3, 3]

print("Given list : ", listA)

# 各要素を2回繰り返して新しいリストを作成
Newlist = list(reduce(add, [(i, i) for i in listA]))

# 結果を表示
print("New list after duplication: ", Newlist)

実行結果

上記のコードを実行すると、以下の出力が得られます。

Given list : ['Mon', 'Tue', 9, 3, 3]
New list after duplication: ['Mon', 'Mon', 'Tue', 'Tue', 9, 9, 3, 3, 3, 3]

リスト内包表記 [(i, i) for i in listA] で各要素を2つ含むタプルのリストを作成し、reduce(add, ...) によってそれらをすべて連結しています。

まとめ

リストの要素を繰り返し複製する方法として、以下の3つを紹介しました。

  • リスト内包表記+ネストしたforループ:最もシンプルで読みやすい方法。小規模なデータに適しています。
  • itertools.chain.from_iterable():メモリ効率に優れ、大規模データの処理に向いています。
  • functools.reduce():関数型プログラミングのスタイルで、他の集計処理との組み合わせにも応用できます。

どの方法も同じ結果になりますが、コードの可読性やパフォーマンスの観点から、通常はリスト内包表記itertoolsを使う方法が推奨されます。用途に応じて最適な手法を選択してください。

  1. Pythonで整数リストの各要素に値Kを加算する3つの方法

    データ分析では、新しいシナリオの結果を判断するために、Pythonリストの各要素に特定の値を加算する必要がある場面があります。これにより、異なる値を与えた場合にデータセットがどのように振る舞うかを複数のシナリオでテストでき、そうした状況に対応できるモデルやアルゴリズムの構築につながります。本記事では、リストの全要素に同じ値を加算するための代表的な3つの手法を、具体的なコード例とともに解説します。方法1:リスト内包表記を使うリスト内包表記は、リストの各要素をループ処理する際にもっとも広く使われる簡潔な書き方です。以下の例では、シンプルなforループの構文でリストの各要素に同じ数値を加算しています

  2. Pythonのappend()とextend()の違いをわかりやすく解説

    Pythonのリストに要素を追加する際によく使われるメソッドが append() と extend() です。どちらもリストの要素数を増やすために使用しますが、動作は大きく異なります。この記事では、それぞれの特徴と違いを具体例とともに解説します。 append()メソッドとは append() は、渡された要素をリストの末尾に「1つの要素」として追加します。引数として渡せるのは1つだけです。仮に引数がリストであっても、そのリスト全体が「1つの要素」として元のリストに加わり、要素数は1だけ増えます。 構文: list_name.append(値) ※ 引数は1つのみ append()の使用