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

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

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

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

Q&A

解決済

6回答

1217閲覧

リストに同じ要素があるか判定する際の構文エラー

netz-eng

総合スコア105

Python

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

0グッド

0クリップ

投稿2020/11/09 07:05

リストに同じ要素があるか判定したい

独学でPythonを勉強しています。

作成したリストに同じ要素が含まれているかを判定したいのですが、実行するとエラーが出てしまいます。
初歩的なところでつまずいているとは思うのですが、具体的にどこがエラーの原因となっているか分かりません。

お詳しい方、是非ご回答をよろしくお願いします。

発生している問題・エラーメッセージ

python

1Traceback (most recent call last): 2 File "<stdin>", line 1, in <module> 3 File "<stdin>", line 2, in ConFirm 4TypeError: 'int' object is not iterable

該当のソースコード

python

1# リストに同じ要素があるか判定する関数 2def ConFirm(list): 3 for i in len(list): 4 a = 0 5 if not list[i] == "": 6 for j in len(list): 7 if not i == j and list[i] == list[j]: 8 a = 1 9 break 10 if a == 1: 11 return False 12 else: 13 return True 14 15List = ["a", "b", "c", "d", "e", "f"] 16c = ConFirm(List) <- エラー箇所

補足情報(FW/ツールのバージョンなど)

Windows10
Python 3.8.3

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

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

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

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

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

guest

回答6

0

参考情報

  • リストとリストを比較して、共通する要素をリストで取り出す方法

https://qiita.com/yamao2253/items/309fdaa74b8f9d38ac46

投稿2020/11/11 11:48

katoy

総合スコア22324

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

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

netz-eng

2020/11/13 01:03

ご回答ありがとうございます。 なるほど、色んな方法があるんですね。 時と場合によって、使い分けることもできそうです。
guest

0

ご参考まで

Python

1def ConFirm(lst): 2 #return False if len(lst) == len(set(lst)) else True 3 return len(lst) != len(set(lst)) 4 5lst1 = ["a", "b", "c", "d", "e", "f"] 6print(ConFirm(lst1)) # False 7 8lst2 = ["a", "b", "a", "d", "e", "f"] 9print(ConFirm(lst2)) # True

すでに jeanbiego さんが提示済みでした。m(__)m
他の方の回答を確認せずに書き込んですみませんでした。

投稿2020/11/10 02:12

編集2020/11/10 02:31
lehshell

総合スコア1156

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

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

kazuma-s

2020/11/10 02:21 編集

そのやり方は jeanbiegoさんが既に回答していますし、 def ConFirm(lst): return len(lst) != len(set(lst)) と書けば if else も False も True も要りません。
lehshell

2020/11/10 02:26

return len(lst) != len(set(lst)) に訂正しようとログインし直したら。。。 確かに他の方が提示済みでしたね。失礼しました。
netz-eng

2020/11/11 01:50

ご回答ありがとうございます。 どうかお気になさらず!
guest

0

ベストアンサー

最初に重複が見つかるところで探索を打ち切るので効率がよいと思われる方法

Python

1def ConFirm(lst): 2 a = [] 3 for e in lst: 4 if e in a: 5 return True 6 a += e 7 return False 8 9lst1 = ["a", "b", "c", "d", "e", "f"] 10print(ConFirm(lst1)) 11 12lst2 = ["a", "b", "a", "d", "e", "f"] 13print(ConFirm(lst2))

追記
空のリスト a を作り、それを拡張していくのは効率が良いとは言えないかもしれません。
次のコードはどうでしょうか?

Python

1def ConFirm(lst): 2 for i, e in enumerate(lst): 3 for j in range(i): 4 if lst[j] == e: 5 return True 6 return False

投稿2020/11/09 10:47

編集2020/11/09 11:45
kazuma-s

総合スコア8224

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

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

netz-eng

2020/11/10 01:47

ご回答、追記ありがとうございます。 自分でも冗長なことをしている自覚はあったのですが、こんな方法で実現できるんですね、勉強になりました!
guest

0

提示されたコードの問題点は他の方の回答を見てもらうとして、
リストには、指定した値の要素が何個あるのかを返すメソッドcountがあるので、

Python

1def ConFirm(lst): 2 for e in lst: 3 if lst.count(e) > 1: 4 return True 5 return False

とすれば、同じ結果が得られます。

投稿2020/11/09 07:28

Daregada

総合スコア11990

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

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

netz-eng

2020/11/10 01:49

ご回答ありがとうございます。 今回は要素数を数えたいわけではなかったので、他の方をBAに選ばせていただきましたが、今後こういった内容を実現したいときには参考にさせていただきます!
guest

0

for文の書き方ですが、inの後にはintを置いても動きません。たとえばrangeを使うと、引数までのイテレータを作ってくれるので動作します。(python iterableとかでググってみてください)
×for i in len(list):
for i in range(len(list)):
※質問とは関係ないですが、listはPythonの型名なので変数名には使用しないほうが良いです。

あと、単に重複判定だけならset化すると早いです。(set化すると重複要素がなくなるので、要素数が減ることを利用)

python3

1# リストに同じ要素があるか判定する関数 2def ConFirm(lst): 3 if len(lst) == len(set(lst)): 4 return False 5 else: 6 return True 7 8lst1 = ["a", "b", "c", "d", "e", "f"] 9print(ConFirm(lst1)) # -> False 10lst2 = ["a", "b", "c", "c", "e", "f"] 11print(ConFirm(lst2)) # -> True 12

投稿2020/11/09 07:23

編集2020/11/09 07:24
jeanbiego

総合スコア3966

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

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

netz-eng

2020/11/10 01:54

ご回答ありがとうございます。 エラーについて教えてくださって、助かりました! なるほど、lenだけでは動かないんですね……勉強になります。 > listはPythonの型名なので変数名には使用しないほうが良いです。  こちらも、教えてくださってありがとうございます。これから気をつけますね。 > あと、単に重複判定だけならset化すると早いです。  これ、すごくスマートな方法で驚きました。先に他のドンピシャ回答を見てしまったため、そちらをBAに選ばせていただきましたが、こちらもすごく良い方法ですね!
guest

0

python

1def ConFirm(list): 2 for i in range(len(list)): 3 a = 0 4 if not list[i] == "": 5 for j in range(len(list)): 6 if not i == j and list[i] == list[j]: 7 a = 1 8 break 9 if a == 1: 10 return False 11 else: 12 return True

修正箇所
for i in len(list):, for j in len(list):
for i in range(len(list):), for j in range(len(list)):
pythonのfor文では数値だけの場合エラーを吐くのでrangeをつけましょう

投稿2020/11/09 07:14

sk-sora--ypi

総合スコア535

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

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

netz-eng

2020/11/10 01:56

ご回答ありがとうございます。 lenだけだと駄目なんですね……勉強になりました。 ご修正いただいたコードで、無事動作確認できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問