質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1255閲覧

set()を使うときのlist()の使う意味

wizerd

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/19 02:26

編集2021/07/19 04:27

知りたいこと 

**set()を使うときのlist()を使う意味について知りたいです。
リストの重複を削除するためには
set()を使えばいいとわかり、その時にlist()に入れても入れなくてもどちらでもいいと表記されていたのですが、この時のlist()**を使う意味と使わなくてもいい理由を教えていただきたいです!

該当のソースコード

l = [3, 3, 2, 1, 5, 1, 4, 2, 3] print(set(l)) # {1, 2, 3, 4, 5} print(list(set(l))) # [1, 2, 3, 4, 5]

今回の疑問が生まれたサイト

https://note.nkmk.me/python-list-unique-duplicate/
の中の 『元のリストの順序を保持しない: set()』 という項目

調べたが疑問を解決できなかったサイト

https://obgynai.com/python-list-1/

https://www.atmarkit.co.jp/ait/articles/1905/31/news015.html

https://www.atmarkit.co.jp/ait/articles/1905/31/news015.html

↑上記のサイト以外も閲覧したのですがset()とlist()を一緒に使う意味を見つけれませんでした。

###どのように調べたか(google検索方法)
1、 python list() 使い方
2、 python list() 関数 使い方
3、 list() 
4、python list()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/07/19 04:14

URLはクリップみたいなボタンのやつを使った方が見やすいですよ。
wizerd

2021/07/19 04:28

細かいところまでご指導ありがとうございます!
guest

回答4

0

細かい構造は省きますが、listとsetの違いとしては、

list

  • 順番がある
  • 一個ずつ確認しないと特定の値が入っているか分からない(10個の要素があったら、最悪10回中身を見ることになる)

set

  • 順番がない(取り出す順番自体は固定だが制御できない)
  • 特定の値を含むかどうかが瞬時にわかる(10個の要素からある1つが含まれるかどうかが一発でわかる)
  • 重複しない

ですね。状況によって使い分けます。
不正確ですが、イメージとしては、

py

1l = [5, 2, 2, 3]

というlistに対して、setは

py

1s = [False, False, True, True, False, True]

でs[0]==Falseなので0はsに含まれない、s[2]==Trueなので2はsに含まれる、みたいな感じです。TrueかFalseなので重複が何個あっても一個と同じになります。

listでは例えば先頭からl[0],l[1]...と見ていったら5が入ってるかわかるのは4回目ですが、setではs[5]==Falseなことが一発でわかります。

また上記の例は数値ですが、実際には文字列なども扱うため一定のルールでデータを数値に変換する(=ハッシュ化)ため、元のデータがどんな数値になるのか人には分からず、setのデータの順番は(実際に順番に取り出してみるまで)知ることはできません。

ちなみにTrue/Falseでなくデータを持つのがdictだと思って問題ないです。setはほぼほぼdictの制限版なので。

もっと詳しく正確に知りたい場合は「配列」と「ハッシュテーブル」について調べてください。

投稿2021/07/19 04:30

編集2021/07/19 04:32
kairi003

総合スコア1332

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizerd

2021/07/19 04:48

回答ありがとうございます! 勉強不足で六割ほどしか理解できませんでしたが、 listとsetの違いについて知ることができました!
guest

0

こういう場合は公式ドキュメントを見たほうが確実です。

公式ドキュメント 組み込み型 シーケンス型 --- list, tuple, range

公式ドキュメント 組み込み型 set(集合)型 --- set, frozenset

上記を読んでわからない場合は、

Python チュートリアル
を一通り読みましょう。

投稿2021/07/19 04:17

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizerd

2021/07/19 04:28

回答ありがとうございます! 読んでみます!
guest

0

ベストアンサー

list() に入れるかどうかは、そのプログラムの目的によります。

提示して頂いたプログラムの目的が、「リストの重複を除いて、要素を表示すること」なのであれば、list に入れなくても目的を達成しているわけですから、list に入れる必要はないでしょう。

投稿2021/07/19 03:16

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizerd

2021/07/19 04:12

回答ありがとうございます! 目的によって使い分けるのですか! では他の関数などで今回求めたものを使う場合などではlistに入れた方がいいとゆうことですか! 分かりました!
nskydiving

2021/07/19 04:33

そうです。 元のサイトにも、「これをlist()で再びリストにすればOK。タプルにしたい場合はtuple()を使えばよい。もちろんsetのままでもよい。」と書かれています。 つまり、用途に応じて使い分けてくださいということですね。
wizerd

2021/07/19 05:11

確かに今思えばそんなに複雑なことではありませんね!ありがとうございました!
guest

0

まず今回の質問を答える前にデータ構造を理解すべきだと提案します。

これがわかっていないと理解しづらいです。
(理解した気になることはあっても、根本的には理解していないだろうし)


[追記1]

# やっとPCで出来たので追記

すでに良い回答が付いているので二番煎じになりますが、書いておきます。

Pythonのリストはデータ構造とアルゴリズムのリスト構造ではなく、他の言語でいう「配列」のようです。

List()は、リストオブジェクト(他の言語だと配列)を作りだすものです。

一方、Setは、(内部構造は分かりませんが)「数Aでの『集合と論理』での集合」を表すもののようです。

なので、Setは『同じデータは共存できない』です。

たとえば、an = { 1, 1, 2, 3, 2, 4 } は、1 と 2 がそれぞれダブっています。
なので、セットしたとしても、

an = { 1, 2, 3, 4 } になるはずです。

つまり、本来なら要素数 6 になるはずが、重複を許さないため、要素数 4 となります。

(ちなみにC++のstd::setはここによると木構造で表現しているっぽい)

対象重複を許すかどうかデータの変更データの並び内部実装数学的演算
List許す可能入力順配列不可能
Set許さない可能順不同ハッシュテーブル可能

参考: 公式ドキュメント
参考: Pythonのset(集合)の表示順序について

データ列中で出てくるデータが重複しないならListでもSetでもいいかもしれません。

でも、ちゃんと理解した上で使うべきかも。

最悪時、(Pythonではあり得るかどうかはわかりませんが) 実例のようなこともありますから。

上記の表のように、『どういう内部処理か』とか『強みや弱み』とかを理解して、
仕様によって決める』のがベターですね。

投稿2021/07/19 02:51

編集2021/07/19 07:50
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wizerd

2021/07/19 04:03

回答ありがとうございます! 分かりずらい質問をしてしまって申し訳ありません。以後気をつけます。 不備はあると思いますが質問内容を編集してみました! データ構造について勉強してみます!
wizerd

2021/07/19 13:46

回答ありがとうございます! 表がとても分かりやすいです! 実例を見て、今後仕事を受けるようになった時のために十分理解して進めて行こうと思いました! 僕のためにここまで時間を使っていただき感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問