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

Share on:

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

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

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

 1def set_and_remove(ls, item):
 2    setted = list(set(ls))
 3    setted.remove(item)
 4    if len(setted) > 0:
 5        return False
 6    else:
 7        return True
 8
 9ls = [ 'a' for i in range(10) ]
10ls.append('b')
11
12b = set_and_remove(ls, 'a')
13
14if b:
15    print('only a')
16else:
17    print('include other a')

実行結果

1include other a

setしてremoveする

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

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

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

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

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

 1def for_loop(ls ,item):
 2    print(ls, item)
 3    for i in ls:
 4        if not i == item:
 5            return False
 6    return True
 7
 8ls = [ 'a' for i in range(10) ]
 9ls.append('b')
10
11b = set_and_remove(ls, 'a')
12
13if b:
14    print('only a')
15else:
16    print('include other a')

実行結果

1include other a

not inで比較

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

 1def is_inclue(_bool, item):
 2    if _bool:
 3        print('include other ' + str(item))
 4    else:
 5        print('only ' + str(item))
 6
 7# only a
 8ls = [ 'a' for i in range(10) ]
 9print(ls)
10b = (not 'a') in ls
11is_inclue(b, 'a')
12
13# include b
14ls.append('b')
15print(ls)
16b = (not 'a') in ls
17is_inclue(b, 'a')
18
19# only 0
20ls = [ 0 for i in range(10) ]
21print(ls)
22b = (not 0) in set(ls)
23is_inclue(b, 0)
24
25# only 1
26ls.append(1)
27print(ls)
28b = (not 0) in set(ls)
29is_inclue(b, 0)

実行結果

1['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
2only a
3['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'b']
4only a
5[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
6only 0
7[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
8include other 0

速度の比較

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

 1#-*- using:utf-8 -*-
 2import time
 3
 4def for_loop(ls ,item):
 5    for i in ls:
 6        if not i == item:
 7            return False
 8    return True
 9
10ls = [ 'a' for i in range(10000000) ]
11ls.append('b')
12
13start = time.time()
14b = for_loop(ls, 'a')
15elapsed_time = time.time() - start
16
17if b:
18    print('only a', elapsed_time, 'sec')
19else:
20    print('include other a', elapsed_time, 'sec')
21
22
23def set_and_remove(ls, item):
24    setted = list(set(ls))
25    setted.remove(item)
26    if len(setted) > 0:
27        return False
28    else:
29        return True
30
31ls = [ 'a' for i in range(10000000) ]
32ls.append('b')
33
34start = time.time()
35b = set_and_remove(ls, 'a')
36elapsed_time = time.time() - start
37
38if b:
39    print('only a', elapsed_time, 'sec')
40else:
41    print('include other a', elapsed_time, 'sec')

実行結果

1include other a 0.8377599716186523 sec
2include other a 0.09873580932617188 sec

関連記事