お悩み女子Pythonの配列を調べたのに、出てくるのはリストばかり。配列とリストは同じものなの?
Pythonで「配列」と書かれている場合、たいていはリスト(list)を指します。Excelの1列分の値やCSVの1行分のデータを、順番に並べてまとめて持てるデータの形です。
この記事ではPythonの配列(リスト)の基本操作と、Excelの売上列を集計する使い方を、動くコードつきで紹介します。載せているコードはWindows 11 と Python 3.12 で動くことを確かめています。
- Pythonの配列がリストを指す理由と、arrayモジュール・NumPyとの違い
- リストの作り方と、要素の取り出し方
- 追加・変更・削除、繰り返し、並べ替えの書き方
- つまずきやすい3つの例と直し方
- Excelの売上列をリストにして集計する実務の例
Pythonのリスト・arrayモジュール・NumPyの違い
他の言語で配列と呼ぶ役割は、Pythonでは主にリストが担います。ただし、Pythonには array モジュールと NumPy の配列もあり、名前が似ているので混同しやすくなります。
| 種類 | 中身の型 | 入手 | 向いている場面 |
|---|---|---|---|
| リスト(list) | 混ぜてもよい | Python に標準で付属 | 店舗名や行データなど、業務データ全般 |
| array モジュール | 同じ数値の型だけ | 標準ライブラリ(import が必要) | 大量の数値をコンパクトに持つとき |
| NumPy の配列 | 数値の型をそろえる | 別にインストールが必要 | 数値計算や統計 |
お悩み女子結局、業務で使うのはどれ?
なべくんほとんどの場面でリストです。array と NumPy は、数値を大量に扱う必要が出てから考えれば間に合います。
リスト(list)
リストは角括弧 [ ] の中に値を並べて作ります。文字列も数値も混ぜて入れられ、あとから追加や削除もできます。業務で扱う店舗名の一覧やExcelの列は、まずリストで持てば足ります。
arrayモジュール
array は標準ライブラリで、公式ドキュメントでは入れられる値の型が制限された、リストによく似たものと説明されています。型は「型コード」で指定します。整数なら "i" です。
from array import array
amounts = array("i", [120000, 98000, 75000])
amounts.append(50000)
print(amounts)
実行結果は次のとおりです。
array('i', [120000, 98000, 75000, 50000])
整数用の array に文字列を入れようとすると、エラーで止まります。
from array import array
amounts = array("i", [120000, 98000, 75000])
amounts.append("東京")
TypeError: 'str' object cannot be interpreted as an integer
数値だけを大量に持つ場面以外では、リストのほうが扱いやすくなります。
NumPyの配列
NumPy は数値計算用のライブラリで、Python の公式ドキュメントの array の項目でも、別の配列型を定義するパッケージとして紹介されています。標準では入っておらず、pip install numpy のように別に入れます。Excelの集計や文字列の整形が中心の業務なら、最初はリストで十分です。
Pythonのリストの作成と要素の取り出し
リストの作り方と、中身の取り出し方です。位置の数え方は文字列のスライスやrange関数と同じ考え方です。
角括弧で作る
stores = ["東京", "大阪", "名古屋"]
mixed = ["東京", 120000, True]
print(stores, len(stores))
print(mixed)
実行すると、次のように表示されます。
['東京', '大阪', '名古屋'] 3
['東京', 120000, True]
値はカンマで区切ります。len() で要素の数が分かります。2つ目のリストのように型を混ぜることもできますが、同じ種類の値をそろえておくほうが、あとの集計で迷いません。
位置を指定して取り出す
stores = ["東京", "大阪", "名古屋", "福岡"]
print(stores[0])
print(stores[-1])
print(stores[1:3])
print("大阪" in stores)
出力は次のとおりです。
東京
福岡
['大阪', '名古屋']
True
位置は0から数え、[-1] は最後の要素です。[1:3] のスライスは位置1から2までの要素を取り出し、終了の位置3は含みません。in を使うと、値が入っているかを True か False で調べられます。
Pythonのリストの追加・変更・削除|append・extend・remove・pop
リストは作ったあとで中身を変えられます。操作ごとにメソッドが分かれているので、一覧で確かめてから使い方を見ます。
| 書き方 | 働き |
|---|---|
| append(値) | 末尾に1つ追加する |
| extend(リスト) | 末尾に複数の値をまとめて追加する |
| insert(位置, 値) | 指定した位置に挿入する |
| remove(値) | 指定した値を削除する(最初の1つ) |
| pop() | 末尾の要素を取り出して、リストから削除する |
要素を追加する
stores = ["東京", "大阪"]
stores.append("名古屋")
stores.extend(["福岡", "札幌"])
stores.insert(0, "本社")
print(stores)
結果は次のとおりです。
['本社', '東京', '大阪', '名古屋', '福岡', '札幌']
append は1つ追加、extend は複数をまとめて追加です。insert の 0 は先頭の位置で、「本社」が先頭に入りました。
append と extend は、リストを渡したときの結果が変わります。
a = ["東京"]
a.append(["大阪", "名古屋"])
print(a)
b = ["東京"]
b.extend(["大阪", "名古屋"])
print(b)
実行すると、次のように表示されます。
['東京', ['大阪', '名古屋']]
['東京', '大阪', '名古屋']
append にリストを渡すと、リストがそのまま1つの要素として入ります。値を1つずつ足したいときは extend です。
変更と削除
stores = ["本社", "東京", "大阪", "名古屋", "福岡", "札幌"]
stores[0] = "本店"
stores.remove("札幌")
last = stores.pop()
print(last, stores)
実行すると、次のように表示されます。
福岡 ['本店', '東京', '大阪', '名古屋']
stores[0] = "本店" のように位置を指定して代入すると、その要素を書き換えられます。remove は値で、pop は末尾から削除します。pop は削除した値を返すので、変数 last で受け取れます。
Pythonのリストの繰り返しと並べ替え|for・sorted・内包表記
リストの中身を1つずつ処理したり、並べ替えたり、条件で絞り込んだりする書き方です。業務で使う集計処理の多くは、この3つで書けます。
forで順に処理する
for文でリストの要素を順に取り出せます。店舗名のリストと売上のリストを組み合わせるときは、zip() で2つを同時に取り出すと便利です。
stores = ["東京", "大阪", "名古屋"]
sales = [120000, 98000, 75000]
for store, amount in zip(stores, sales):
print(f"{store}: {amount:,}円")
出力は次のとおりです。
東京: 120,000円
大阪: 98,000円
名古屋: 75,000円
並べ替え
並べ替えには sorted() と sort() の2つがあります。
sales = [98000, 120000, 75000]
print(sorted(sales, reverse=True))
print(sales)
sales.sort()
print(sales)
出力は次のとおりです。
[120000, 98000, 75000]
[98000, 120000, 75000]
[75000, 98000, 120000]
sorted は元のリストを変えず、並べ替えた新しいリストを返します。sort は元のリスト自体を並べ替えます。大きい順にしたいときは reverse=True を付けます。
条件で絞り込む内包表記
条件に合う要素だけを集めた新しいリストは1行で作れます。これを内包表記といいます。
sales = [120000, 98000, 75000, 150000]
big = [v for v in sales if v >= 100000]
print(big)
画面には次のように出ます。
[120000, 150000]
for v in sales で順に取り出し、if v >= 100000 に合うものだけを集めています。10万円以上の売上だけを抜き出す、といった絞り込みに使えます。
Pythonのリストでつまずきやすい3つの例
リストで困りやすいのはエラーで止まるものと、エラーが出ずに結果がずれるものです。
範囲外の位置でIndexError
要素が3つのリストに、位置5を指定すると止まります。
stores = ["東京", "大阪", "名古屋"]
print(stores[5])
IndexError: list index out of range
list index out of rangeは、「その位置の要素はない」という意味です。位置は0から数えるので、要素が3つなら使えるのは0から2までです。Excelの行を順に処理するときは、len() で数を確かめてから位置を決めます。
代入だけではコピーにならない
a = ["東京", "大阪"]
b = a
b.append("名古屋")
print(a)
c = a.copy()
c.append("福岡")
print(a)
print(c)
結果は次のとおりです。
['東京', '大阪', '名古屋']
['東京', '大阪', '名古屋']
['東京', '大阪', '名古屋', '福岡']
b = a は、リストを複製せず、同じリストに別の名前を付けるだけです。b に追加すると a も変わります。複製したいときは a.copy() を使います。公式チュートリアルでは、copy は浅いコピーを返す、と説明されています。
sortの戻り値はNone
並べ替えた結果を変数に入れ直すときに、よく起きる間違いです。
sales = [98000, 120000, 75000]
sales = sales.sort()
print(sales)
実行すると、次のように表示されます。
None
sort() はリストをその場で並べ替えて、戻り値は None です。公式のソートHOWTOにもsorted との混乱を避けるために None を返す、と書かれています。新しいリストがほしいときは sorted を使います。
Pythonのリストの実務例|Excelの売上列を集計する
最後に、Excelの店舗名の列と売上の列をリストに読み込んで、合計・平均・上位3店を出す例です。Excelを Python から操作するライブラリ openpyxl を使います。入っていない場合は、コマンドプロンプトで pip install openpyxl を実行すると入れられます。
列をリストに読み込む
A列に店舗名、B列に売上が5行並んだ「売上一覧.xlsx」を用意しました。1行目は見出しです。
from openpyxl import load_workbook
wb = load_workbook("売上一覧.xlsx")
ws = wb.active
stores = []
sales = []
for row in range(2, ws.max_row + 1):
stores.append(ws.cell(row=row, column=1).value)
sales.append(ws.cell(row=row, column=2).value)
print(f"合計: {sum(sales):,}円")
print(f"平均: {sum(sales) / len(sales):,.0f}円")
ranking = sorted(zip(sales, stores), reverse=True)
for amount, store in ranking[:3]:
print(f"{store}: {amount:,}円")
実行すると、次のように表示されます。
合計: 409,000円
平均: 81,800円
東京: 120,000円
大阪: 98,000円
名古屋: 75,000円
2行目から最終行まで1行ずつ読み、append で2つのリストに足しています。ws.max_row は、データが入っている最後の行の番号です。
合計・平均・上位を出す
sum() はリストの合計、len() は件数なので、割れば平均です。上位3店はzip(sales, stores) で「売上と店舗名の組」を作り、sorted(..., reverse=True) で売上の大きい順に並べて、先頭の3つを取り出しています。
売上を先に書いた組にしているので、売上の順で並びます。店舗名を先にすると、店舗名の順になってしまいます。
空のセルの値は None になり、sum() に混ざると TypeError で止まります。空のセルがありそうな列では、読み込むときに None を飛ばす処理を入れてください。
Pythonの配列に関するよくある質問
重複の削除、行と列の表し方、NumPyの導入についての疑問をまとめました。
- 重複した値を取り除くには?
-
list(dict.fromkeys(names))と書くと、重複を消して最初に出た順番を保てます。たとえば["東京", "大阪", "東京", "名古屋", "大阪"]は['東京', '大阪', '名古屋']になります。 - Excelのような表(行と列)はどう表しますか?
-
リストの中にリストを入れる「2次元リスト」で表せます。
rows = [["東京", 120000], ["大阪", 98000]]なら、rows[0][1]は120000です。行数や列数が増えて扱いにくくなったら、pandas のようなライブラリを検討します。 - NumPyは入れておいたほうがよいですか?
-
Excelの集計や文字列の整形が中心なら、リストと標準ライブラリで足りる場面が多くあります。数値計算や統計が必要になってから、別にインストールして使います。
Pythonの配列とリストの要点
配列(リスト)のポイントを整理します。
配列とは:多くの場合リストのこと。array は型が限られ、NumPy は別にインストールが必要。
基本操作:作る・取り出す・append で追加・remove と pop で削除。位置は0から数える。
繰り返しと並べ替え:for で順に処理、sorted で新しいリスト、内包表記で絞り込み。
つまずきやすい点:範囲外の位置は IndexError。b = a は複製ではない。sort() の戻り値は None。
業務での使いどころ:Excelの列をリストに読み込み、sum・len・sorted で集計する。
まずは手元のExcelの列を1つ選んでリストに読み込み、合計を出すところから始めてみてください。
リストと一緒に使うことの多い処理は、次の記事でも扱っています。
参考資料
リスト型についてもう少し | Python チュートリアル
リスト | Python 3 ドキュメント
array — 効率的な数値配列 | Python 3 ドキュメント
ソート HOWTO | Python 3 ドキュメント
NumPy ドキュメント
openpyxl ドキュメント
