Python リストに特定の要素以外が含まれるか判定

2020/04/04 categories:Python| tags:Python|List|

リストに特定の要素以外が含まれるか判定したくなりましたが、調べてみると例が見つからなかったので、判定方法を考えてみました。

forで特定の要素以外が含まれるか探す

リストのforループを作成して、特定の要素とリストの要素が一致しているかをすべての要素に対して行う処理が最も単純かと思います。テストとして、lsにはaが10個含まれて11個目の要素がbというリストを用意してset_and_removeというメソッドで、特定の要素以外が含まれるか判定するプログラムを作成しました。

def set_and_remove(ls, item):
    setted = list(set(ls))
    setted.remove(item)
    if len(setted) > 0:
        return False
    else:
        return True

ls = [ 'a' for i in range(10) ]
ls.append('b')

b = set_and_remove(ls, 'a')

if b:
    print('only a')
else:
    print('include other a')

実行結果

include other a

setしてremoveする

まずはsetで重複無しリストを取得します

ls = ['a', 'a', 'a', 'b']
setted = list(set(ls))

その後、特定の要素’a’をsettedからremoveします

ls = ['a', 'a', 'a', 'b']
setted = list(set(ls))
setted.remove('a')

その特定の要素をremoveしたリストのサイズが0以上だったら、元のリストに特定の要素が含まれるという判定ができます

def for_loop(ls ,item):
    print(ls, item)
    for i in ls:
        if not i == item:
            return False
    return True

ls = [ 'a' for i in range(10) ]
ls.append('b')

b = set_and_remove(ls, 'a')

if b:
    print('only a')
else:
    print('include other a')

実行結果

include other a

not inで比較

もう少し調べてみると(not a) in listというので判定できそうなので試してみました。しかし、intのリストなら判定できましたが、文字列のリストで試したらうまく判定できませんでした。

def is_inclue(_bool, item):
    if _bool:
        print('include other ' + str(item))
    else:
        print('only ' + str(item))

## only a
ls = [ 'a' for i in range(10) ]
print(ls)
b = (not 'a') in ls
is_inclue(b, 'a')

## include b
ls.append('b')
print(ls)
b = (not 'a') in ls
is_inclue(b, 'a')

## only 0
ls = [ 0 for i in range(10) ]
print(ls)
b = (not 0) in set(ls)
is_inclue(b, 0)

## only 1
ls.append(1)
print(ls)
b = (not 0) in set(ls)
is_inclue(b, 0)

実行結果

['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
only a
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'b']
only a
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
only 0
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
include other 0

速度の比較

リストに含まれるaの数を10,000,000個に増やして処理速度の比較をしてみました。速度の差は、forループによる処理と、setしてからの処理の実行時間の差になります。もちろんsetを利用した処理の方が早いという結果になりました。

#-*- using:utf-8 -*-
import time

def for_loop(ls ,item):
    for i in ls:
        if not i == item:
            return False
    return True

ls = [ 'a' for i in range(10000000) ]
ls.append('b')

start = time.time()
b = for_loop(ls, 'a')
elapsed_time = time.time() - start

if b:
    print('only a', elapsed_time, 'sec')
else:
    print('include other a', elapsed_time, 'sec')


def set_and_remove(ls, item):
    setted = list(set(ls))
    setted.remove(item)
    if len(setted) > 0:
        return False
    else:
        return True

ls = [ 'a' for i in range(10000000) ]
ls.append('b')

start = time.time()
b = set_and_remove(ls, 'a')
elapsed_time = time.time() - start

if b:
    print('only a', elapsed_time, 'sec')
else:
    print('include other a', elapsed_time, 'sec')

実行結果

include other a 0.8377599716186523 sec
include other a 0.09873580932617188 sec

Share post

Related Posts

コメント