List:
alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5 in alist # True
10 in alist # False
Tuple:
atuple = ('0', '1', '2', '3', '4')
4 in atuple # False
'4' in atuple # True
String:
astring = 'i am a string'
'a' in astring # True
'am' in astring # True
'I' in astring # False
Set:
aset = {(10, 10), (20, 20), (30, 30)}
(10, 10) in aset # True
10 in aset # False
Dict:
dict有点特殊: in关键字参数只检查键。如果你想搜索值,你需要指定.values。如果希望搜索键,也可以使用相同的方法:
adict = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
1 in adict # True - 默认搜索的是key
'a' in adict # False
2 in adict.keys()# True - 显式指定搜索key
'a' in adict.values() # True - 显式指定搜索值
(0, 'a') in adict.items() # True - 显式搜索key/value键值对
为了允许在自定义类中使用in,该类必须提供包含的内置方法__contains__,如果不能提供,则必须提供一个__iter__方法
假设您有一个包含列表的列表类:
class ListList:
def __init__(self, value):
self.value = value
# 创建一组用于快速访问的值
self.setofvalues = set(item for sublist in self.value for item in sublist)
def __iter__(self):
print('Using __iter__.')
# 遍历子列表的迭代器
return (item for sublist in self.value for item in sublist)
def __contains__(self, value):
print('Using __contains__.')
# 仅搜索值是否在其中
return value in self.setofvalues
#使用in进行测试
a = ListList([[1,1,1],[0,1,1],[1,5,1]])
print(10 in a) # False
# Prints: Using __contains__.
print(5 in a) # True
# Prints: Using __contains__.
首先来看寻找索引的代码:
astring = 'Hello on StackOverflow'
astring.index('o')# 4
astring.rindex('o') # 20 注意:是从右边开始搜索匹配
astring.find('o')# 4
astring.rfind('o')# 20 注意:是从右边开始搜索匹配
可以看到S.index()与S.find()类似,不过索引字符串中的子串没找到会报错。
而S.find()在找不到substring时,不会报错,而会返回-1
ist和tuple有一个索引方法来获取元素的位置 :
alist = [10, 16, 26, 5, 2, 19, 105, 26]
#返回元素为16的索引值
print(alist.index(16)) # 注意,这里是通过元素查找索引
print(alist.index(15)) # 注意,找不到会报错,所以这里要做好异常处理
tuple的用法完全一样
其实Python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index()
方法,其时间复杂度为O(n) 。对于大数据量,则可以用二分查找进行优化。
二分查找要求对象必须有序,其基本原理如下:
1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3.如果在某一步骤数组为空,则代表找不到。
二分查找也成为折半查找,算法每一次比较都使搜索范围缩小一半, 其时间复杂度为 O(logn),示例代码如下:
import bisect
alist = [i for i in range(1, 100000, 3)] # 生成一个从1开始,步长为3,最大值为100000的有序列表
print(bisect.bisect_left(alist, 4)) # 1
print(index_sorted(alist, 97285)) # 32428