Search搜索方法-Python成为专业人士笔记

来自《Python专业人士笔记》系列

简单搜索

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键值对
      

自定义class搜索

为了允许在自定义类中使用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__.





      

获取字符串的索引 : str.index(),
str.rindex() and str.find(), str.rfind()

首先来看寻找索引的代码:

         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

list 和 tuples获取索引: list.index(),
tuple.index()

ist和tuple有一个索引方法来获取元素的位置 :

         alist = [10, 16, 26, 5, 2, 19, 105, 26]

 #返回元素为16的索引值
 print(alist.index(16))  # 注意,这里是通过元素查找索引 
 print(alist.index(15))  # 注意,找不到会报错,所以这里要做好异常处理
      

tuple的用法完全一样

使用bisect.bisect_left()进行二分查找

其实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
      

你可能感兴趣的:(Search搜索方法-Python成为专业人士笔记)