LoginSignup
1
1

More than 5 years have passed since last update.

python3: リストに指定したものが入っているか確認する方法、どの方法が一番処理速度が早いのか

Last updated at Posted at 2016-02-02

メソッドによってはリスト以外でも対応できるかもしれませんがここでは宿題として出されたプロジェクトの一環として調べていただけなのであえてリストと指定した。

リストに指定したものが含まれているか確認したい時

if myItem in list: #if myItem not in listも可
    # do something
myset = set()
myset.add(item)

理由はわかりませんがセットのほうがいいようです。恐らくリストの中身に入れる数の量やリストの順番と深く関係しているような気がしますが。

どうやらタプル、セット、ディクショナリに上手く適用できるようです。ちなみにstackoverflowのコメントによるとinというのはlist.__contain__というメソッドを呼んで動かしているらしいのでこれをクラスに応用できるんだとか。例はサイトより引用

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>> 

リストの中のストリング数字が全て数字か確かめて全て数字に変えたい。

myList = [1,2,3,4,5,"apple", 9, "orange"]みたいなのがあったときにどうやってリストが数字を含んでいるか確かめたい。

mynewlist = [s for s in mylist if s.isdigit()]

こういうやり方もあるようです。strとしてではなくintとして返ってきますが。

new_list = []
for value in mylist:
    try:
        new_list.append(int(value))
    except ValueError:
        continue
try: 
new_list.append(str(int(value)))

を足せば

ここによるとvar.isdigit()はもし全てのストリング値の中身が数字で且つリストの中に1つ以上ストリンが入っていればTrueを返しそうでないならFalseを返す。

結局どのやりかたが一番早いのか

詳しくはここを参考に。

3.8秒

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

1.9秒

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
Else:
    "Do something with variable b"

2.74秒

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

ちなみにセットでやると処理速度が更に早くなるとか。

この文脈でいくなら結局7 in aが一番早いのではないかという結論に。

参考にしたリンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1