Stack Overflowで最もよく尋ねられるPythonリストの10の質問

10 most frequently asked questions about Python lists on Stack Overflow

現実の生活から出てくる質問。

Towfiqu barbhuiyaによる写真、Unsplash

Stack Overflowは、ソフトウェア、コーディング、データサイエンス、および他の多くの主題に関する数千の質問と回答を見つけることができる情報の宝庫です。

コンテンツ作成者に、自分たちの質問を解決する際に学生がどのような間違いをするか、または学生が理解するのが難しいと思われることについて尋ねると、コンテンツ作成者が正確な予測をすることに失敗することに驚くでしょう。

私はこれを述べることで、Stack Overflowの情報がどれだけ貴重であるかを示しました。Stack Overflowの質問は、人々が仕事で問題を解決しようとしたり、ソフトウェアツールの使用中に間違いを comしている人々から出てきます。したがって、Stack Overflowは現実の課題を非常に正確に反映しています。

この記事では、Stack Overflowで最も頻繁に尋ねられるPythonのリストに関する10の質問について説明します。

リストはPythonの組み込みデータ構造です。これは、角かっこ内のデータポイントのコレクションとして表され、異なるタイプのデータを格納するために使用することができます。

私は「python」と「list」というタグを使用して質問を検索し、スコアでソートしました。

では、始めましょう。

1. ‘for’ループでインデックスにアクセスする

この質問は、タプルや文字列など他のイテラブルにも一般化することができます。基本的には、アイテム自体と一緒にアイテムのインデックスを取得する方法を尋ねています。

この質問に対する最もシンプルでPythonicな回答は、enumerate関数を使用することです。これは、イテラブルを反復処理して得られるカウントと値を含むタプルを返します。

names = ["John", "Jane", "Ashley"]for idx, x in enumerate(names):    print(idx, x)# 出力0 John1 Jane2 Ashley

カウントはデフォルトでは0から開始されますが、startパラメータを使用して変更することもできます。

names = ["John", "Jane", "Ashley"]for idx, x in enumerate(names, start=10):    print(idx, x)# 出力10 John11 Jane12 Ashley

2. リストのリストからフラットなリストを作成するにはどうすればよいですか?

次の図は、この質問で求められていることを説明しています:

リストのリストをフラット化する(著者による画像)

次のリスト内包表記を使用して、この変換を行うことができます:

# リスト内包表記を使用するmylist = [    [1, 5, 3],    [4, 2, 1],    [5, 6]]myflatlist = [item for sublist in mylist for item in sublist]print(myflatlist)# 出力[1, 5, 3, 4, 2, 1, 5, 6]

上記のリスト内包表記は、入れ子のforループとしても書くことができます。これは直感的で理解しやすいですが、特に大きなリストで作業する場合は、リスト内包表記の方がパフォーマンスが向上します。

# forループを使用するmylist = [    [1, 5, 3],    [4, 2, 1],    [5, 6]]myflatlist = []for sublist in mylist:    for item in sublist:        myflatlist.append(item)        print(myflatlist)# 出力[1, 5, 3, 4, 2, 1, 5, 6]

Pandasを使用している場合、explode関数を使用すると、このフラット化操作が非常に簡単になりますが、まずリストをPandasシリーズに変換する必要があります。最終的な出力をリストにしたい場合は、explode関数の出力をリストコンストラクタを使用してリストに変換することができます。

# explode関数を使用します
import pandas as pd
myflatlist = list(pd.Series(mylist).explode())
print(myflatlist)
# 出力結果[1, 5, 3, 4, 2, 1, 5, 6]

3. リスト内のアイテムのインデックスを見つける

アイテムのインデックスは、リスト内のアイテムにアクセスするために使用できます。以下にこの場合を示す例があります:

names = ["John", "Jane", "Ashley", "Max", "Jane"]# インデックス2(つまり3番目のアイテム)のアイテムnames[2]# 出力結果'Ashley'

インデックス2のアイテムは、3番目のアイテムです。なぜならインデックスは0から始まるからです。

質問はそのインデックスを見つける方法を尋ねており、組み込みのindexメソッドを使用して行うことができます。

names = ["John", "Jane", "Ashley", "Max", "Jane"]names.index("Ashley")# 出力結果2

最初から始めて、indexメソッドは順番にリストを検索し、一致が見つかると停止します。したがって、同じアイテムの複数の出現がある場合、indexメソッドは最初のアイテムのインデックスを返します。

すべての出現のインデックスを取得したい場合は、リスト内包表記でenumerate関数を使用することができます:

names = ["John", "Jane", "Ashley", "Max", "Jane", "Abby", "Jane"]janes_indexes = [idx for idx, item in enumerate(names) if item == "Jane"]print(janes_indexes)# 出力結果[1, 4, 6]

指定されたアイテムのインデックス値のリストを返します。

4. Pythonで2つのリストを連結する方法

単純に「+」演算子を使用してリストを連結することができます。

list_1 = [1, 3, 4]list_2 = [12, 23, 30]combined = list_1 + list_2print(combined)# 出力結果[1, 3, 4, 12, 23, 30]

extend関数も使用することができます。これは結合されたリストを返さず、第一のリストを第二のリストのアイテムで拡張します。

list_1 = [1, 3, 4]list_2 = [12, 23, 30]list_1.extend(list_2)print(list_1) # list_1は結合されたリストになりますが、list_2は変わりません# 出力結果[1, 3, 4, 12, 23, 30]

5. リストが空であるかどうかを確認する方法

リストが空であるかどうかを確認する方法はさまざまです。

一つのオプションは、空のシーケンスやコレクションはFalseであることを利用して、if文でリストが空であるかどうかを確認することです。

names = []if not names:    print("リストは空ではありません!")# 出力結果リストは空ではありません!

組み込みのlen関数も使用することができます。これはリスト内のアイテム数を返します。この値が0の場合、リストは空です。

len(names)# 出力結果0

6. Pythonのリストメソッドappendとextendの違いは何ですか?

appendメソッドはリストに新しいアイテムを追加するために使用できます。

names = ["Jane", "Max", "Ashley"]names.append("John")print(names)# 出力結果['Jane', 'Max', 'Ashley', 'John']

値の型に関係なく、それはリスト内に新しいアイテムとして追加されます。したがって、値のリストを追加すると、リストは1つのアイテムになります。

names = ["Jane", "Max", "Ashley"]new_names = ["John", "Adam"]names.append(new_names)print(names)# 出力結果['Jane', 'Max', 'Ashley', ['John', 'Adam']]

上記の名前リストには4つの項目が含まれています。なぜなら、「John」と「Adam」はリストとして追加されているため、「John」と「Adam」は名前リストの項目ではないからです。

「John」が名前リストに存在するかどうかを確認しましょう:

"John" in names# 出力False

ここでextend関数が登場します。この関数は、現在のリストに新しいリストの項目を追加します。extend関数を使って上記の例を行うと、”John”と”Adam”が名前リストに別々の項目として追加されることがわかります。

names = ["Jane", "Max", "Ashley"]new_names = ["John", "Adam"]names.extend(new_names)print(names)# 出力['Jane', 'Max', 'Ashley', 'John', 'Adam']

今、名前リストに「John」が存在するかどうかを確認しましょう:

"John" in names# 出力True

7. リストを均等なサイズのチャンクに分割するにはどうすればよいですか?

以下の図は、この質問で求められていることを示しています:

(image by author)

このタスクにはリスト内包表記を使用することができます。

まず、分割ポイントを決定するためにチャンクサイズを指定する必要があります。

mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]chunk_size = 4[mylist[i:i + chunk_size] for i in range(0, len(mylist), chunk_size)]# 出力[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

チャンクサイズを自由に変更して、出力がどのように変わるかを確認してください。

8. Pythonで辞書の値でリストの辞書をソートするにはどうすればよいですか?

次のリストは、そのアイテムとして辞書を含むリストです。

employees = [    {"name": "Max", "department": "sales"},    {"name": "Jane", "department": "engineering"},    {"name": "Ashley", "department": "hr"}]

アイテム(つまり辞書)を名前でソートしたいです。これはPandasの組み込みsorted関数を使用して行うことができます。名前でソートするためにはkeyパラメータを使用して指定する必要があります。

employees_sorted = sorted(employees, key = lambda x: x["name"])employees_sorted# 出力[{'name': 'Ashley', 'department': 'hr'}, {'name': 'Jane', 'department': 'engineering'}, {'name': 'Max', 'department': 'sales'}]

keyパラメータはアイテムのソート方法を定義します。この場合、辞書から名前を抽出するためにラムダ式が使用され、それがソートに使用されます。

9. リストの最後の要素を取得するにはどうすればよいですか?

最も簡単な方法はインデックスを使用することです。

最初のアイテムのインデックスは0です。また、インデックスを末尾から開始することもできます。その場合、最初のアイテム(つまりリストの最後のアイテム)のインデックスは-1です。

names = ["Jane", "Adam", "Matt", "Jennifer"]names[-1]# 出力'Jennifer'names[0]# 出力'Jane'

10. リストからランダムにアイテムを選択するにはどうすればよいですか?

Pythonのrandomモジュールを使用することができます。

choiceメソッドはランダムに単一のアイテムを選択します。

import randomnames = ["Jane", "Adam", "Matt", "Jennifer", "Abby"]random.choice(names)# 出力'Matt'

n個のアイテムからランダムなサンプルを取得したい場合は、sampleメソッドを使用することができます。

import randomnames = ["Jane", "Adam", "Matt", "Jennifer", "Abby"]random.sample(names, 2) # 2つのアイテムからなるランダムなサンプルを取得する# 出力['Abby', 'Matt']

結論

リストは頻繁に使用されるデータ構造です。変更可能で、異なる型のデータを保持することができるため、データの格納や管理には最適な選択肢です。Pythonを使用して効率的なプログラムを書くためには、リストや他の組み込みデータ構造(例:辞書、セット、タプル)をよく学ぶ必要があります。

この記事で取り上げた質問は、リストを扱う際に直面する課題から出てきたものです。同じ問題に直面しなくても、リストの機能をより良く理解するためにそれらを知っておくことは重要です。

VoAGIのメンバーになると、私の執筆記事とVoAGIのその他のコンテンツをフルアクセスで利用できます。既にメンバーの場合は、新しい記事が公開されるたびに電子メールを受け取りたい場合は忘れずに購読してください。

お読みいただきありがとうございました。ご意見がありましたらお知らせください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more