面试python中的数据结构

Posted 黑黑白白君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试python中的数据结构相关的知识,希望对你有一定的参考价值。



  • 数据结构是高效存储和组织数据的一种方法,它允许你轻松访问和执行数据操作。
  • 在数据结构方面,没有一种适合所有类型的模型。根据不同的需要选择不同的方式来存储数据
    • 也许你想把所有类型的数据存储在一起,或者你想要一些更快的数据搜索,或者一些只存储不同数据项的东西。

  • Python有许多内置的数据结构,可以帮助我们轻松地组织数据,因此有必要先了解这些,以便我们在处理数据时,确切地知道哪些数据结构将有效地解决我们的问题

Python中的内置数据结构(Built-in Data Structure)包括:列表list、元组tuple、字典dict、集合set。



1)列表(list)

列表(List)是一种有序和可更改的集合。Python中的列表是最通用的数据结构,它们用于存储异构数据项。

  • 元素可以是任何数据类型,如数字、字符串等,甚至是另一个列表。

1.1 特点

  • 列表中的每个元素均可变:意味着可以对每个元素进行修改和删除
  • 列表是有序的:每个元素的位置是确定的,可以用索引去访问每个元素
  • 列表中的元素可以是Python中的任何对象:元素可以是字符串、整数、元组、也可以是list等Python中的对象。

Python中的list和C语言中的数组很像,只是list中的元素类型可以为Python中的任意对象,C中的数组只能是同种类型。

>>> x = [1,2,3]
>>> y = {'name':'Sakura'}
>>> z="Test"
>>> a=[x,y,z]
>>> a 
[[1, 2, 3], {'name': 'Sakura'}, 'Test'] 

注意 :list不仅可以像数组那样正向索引,也可以反向索引

1.2 常用方法

thislist = ["apple", "banana", "cherry"]  # 创建
print(thislist[1])  # 通过索引号访问
print(thislist[-1])  # 反向索引,-1表示最后一个
print(thislist[2:5])  # 通过指定范围的起点和终点来指定索引范围,返回值将是包含指定项目的新列表,注意是左闭右开
thislist[1] = "mango"  # 改
print(len(thislist))  # 列表长度
  • 切片

    切片是Python中序列结构独有的一种操作,意思是从序列中选取一个子序列,凡是序列均可切片,list是序列,所以list可以切片。

    # 通过[begin:end]方式完成切片 
    mylist = [1,2,3,4,5]
    mylist[0:2]  # 生成的序列为[1,2,3] 
    
  • 检查是否存在指定的项

    使用 in 关键字

    thislist = ["apple", "banana", "cherry"]
    if "apple" in thislist:
      print("Yes, 'apple' is in the fruits list")
    
  • 添加项目

    append()或者insert()

    thislist = ["apple", "banana", "cherry"]
    thislist.append("orange")  # 将项目添加到列表的末尾
    thislist.insert(1, "orange")  # 在指定的索引处添加项目
    
  • 删除项目

    remove()或者pop()或者del或者clear()

    thislist = ["apple", "banana", "cherry"]
    thislist.remove("banana")  # 删除指定的项目
    thislist.pop()  # 删除指定的索引(如果未指定索引,则删除最后一项)
    del thislist[0]  # 删除指定的索引
    thislist.clear()  # 清空列表
    
  • 复制列表

    copy()或者list()

    list2 = list1  # 注意:list2 将只是对 list1 的引用,list1 中所做的更改也将自动在 list2 中进行。
    thislist = ["apple", "banana", "cherry"]
    mylist = thislist.copy()  # 使用内置的 List 方法 copy()
    mylist = list(thislist)  # 使用内建的方法 list()
    
  • 合并两个列表

    使用 + 运算符或者extend()

    list1 = ["a", "b" , "c"]
    list2 = [1, 2, 3]
    
    list3 = list1 + list2
    list1.extend(list2)
    
  • 常用的内建方法:

    方法描述
    append()在列表的末尾添加一个元素
    clear()删除列表中的所有元素
    copy()返回列表的副本
    count()返回具有指定值的元素数量
    extend()将列表元素(或任何可迭代的元素)添加到当前列表的末尾
    index()返回具有指定值的第一个元素的索引
    insert()在指定位置添加元素
    pop()删除指定位置的元素
    remove()删除具有指定值的项目
    reverse()颠倒列表的顺序
    sort()对列表进行排序


2)元组(Tuple)

元组是有序且不可更改的集合。元组为一个固定的列表,一旦初始化其中的元素便不可修改,只能对元素进行查询。

2.1 特点

  • tuple不支持对元素的修改(包括删除),tuple一初始化便固定下来了。

涉及到Python中的可变对象和不可变对象,像list这样的就是可变对象,tuple便是不可变对象。

  • 因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

2.2 常见操作

  • 因为元组是固定的列表,所以其内置的大多数的方法和列表是差不多的。

  • 如需创建仅包含一个项目的元组,必须在该项目后添加一个逗号,否则 Python 无法将变量识别为元组。

    • 空的tuple可以记为(),若只有一个元素的tuple记为(1,)
  • 可以通过tuple将序列转换为元组,用法和list一样。

  • 创建元组后,将无法更改其值,但是有一种解决方法:可以将元组转换为列表,更改列表,然后将列表转换回元组。

  • del 关键字可以完全删除元组。



3)字典(Dictionary)

字典是一个无序、可变和有索引的集合。Python中使用键(key)-值(value)存储,也就是C++中的map。

3.1 特点

  • 字典中的数据必须以键值对的形式出现。
  • 键不可重复,值可重复。
  • 字典中键(key)是不可变的,为不可变对象,不能进行修改;而值(value)是可以修改的,可以是任何对象。

3.2 常见操作

thisdict =	{  # 创建
  "brand": "Porsche",
  "model": "911",
  "year": 1963
}
x = thisdict["model"]  # 获取 "model" 键的值
x = thisdict.get("model")  # 同上
thisdict["year"] = 2019  # 更改
for x in thisdict.values():  # 使用 values() 函数返回字典的值
  print(x)
for x, y in thisdict.items():  # 使用 items() 函数遍历键和值
  print(x, y)
thisdict.pop("model")  # pop() 方法删除具有指定键名的项
del thisdict["model"]  # del 关键字删除具有指定键名的项目

mydict = thisdict.copy()  # 使用 copy() 方法来复制字典
mydict = dict(thisdict)  # 使用 dict() 方法创建字典的副本
  • 注意:不能通过键入 dict2 = dict1 来复制字典,因为:dict2 只是对 dict1 的引用,而 dict1 中的更改也将自动在 dict2 中进行。


4)集合(Set)

集合是无序和无索引的集合

4.1 特点

  • 集合更接近数学上集合的概念。集合中每个元素都是无序的、不重复的任意对象。
  • 可以通过集合去判断数据的从属关系,也可以通过集合把数据结构中重复的元素减掉
  • 集合一旦创建,就无法更改项目,但是可以添加新项目

4.2 常见操作

集合可做集合运算,可添加和删除元素。

  • 集合的创建

    创建集合时需要用list作为输入集合,可通过add()方法增加元素,remove()方法删除元素。

    • 集合中重复的元素会被过滤掉。
    • 使用 update() 方法将多个项添加到集合中。
    >>> test=set([1,2,3])
    >>> test
    {1, 2, 3}
    
    thisset = {"apple", "banana", "cherry"}
    thisset.update(["orange", "mango", "grapes"])
    
  • 合并两个集合

    可以使用 union() 方法返回包含两个集合中所有项目的新集合,也可以使用 update() 方法将一个集合中的所有项目插入另一个集合中。

    set1 = {"a", "b" , "c"}
    set2 = {1, 2, 3}
    
    set3 = set1.union(set2)
    set1.update(set2)
    
  • 集合的运算

    Python中的集合也可以进行集合的之间的交、并等运算。

    >>> s1 = set([1,2])
    >>> s2=set([2,3])
    >>> s1 & s2  # s1与s2
    {2}
    >>> s1 | s2  # s1与s2进行或运算
    {1, 2, 3}
    


【部分内容参考自】

  • 【Python】Python中的数据结构:https://www.cnblogs.com/myworld7/p/8449614.html
  • Python 教程:https://www.w3school.com.cn/python/python_lists.asp

以上是关于面试python中的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

前端面试题之手写promise

python 用于数据探索的Python代码片段(例如,在数据科学项目中)

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

Python代码阅读(第13篇):检测列表中的元素是否都一样