前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中列表和元组该怎么选?

Python中列表和元组该怎么选?

原创
作者头像
mr.songw
修改2021-01-22 10:52:44
1.5K0
修改2021-01-22 10:52:44
举报
文章被收录于专栏:Python 自习室

列表(list)和元组(tuple)是 Python 中两种重要的数据结构。列表和元组之间有相似的地方也有不同的地方,了解两者的异同可以更好的使用它们,下面我们便对列表和元组做一个比较。

创建
1. 列表和元组创建的语法不同。

列表的创建使用方括号 []

代码语言:txt
复制
my_list = [1, 2, 3, 4, 5, 6]

my_list
Out[4]: [1, 2, 3, 4, 5, 6]

type(my_list)
Out[5]: list

元组的创建使用圆括号 ()

代码语言:txt
复制
my_tuple = (1, 2, 3, 4, 5, 6)

my_tuple
Out[5]: (1, 2, 3, 4, 5, 6)

type(my_tuple)
Out[6]: tuple
2. 列表和元组中的元素类型可以是任意类型,同一个列表或元组中的元素可以是不同类型的。

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

my_list
Out[8]: [1, 2, 3, 'Jan', 'Feb', 'Mar']

type(my_list)
Out[9]: list

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

my_tuple
Out[11]: (1, 2, 3, 'Jan', 'Feb', 'Mar')

type(my_tuple)
Out[12]: tuple
访问
1. 列表和元组都支持使用索引的方式进行访问,索引下标从 0 开始。

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

my_list[0]
Out[14]: 1

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

my_tuple[0]
Out[16]: 1
2. 列表和元组都支持负数索引,负数索引从尾部开始,倒数第一个元素的索引为 -1 ,倒数第二个元素的索引为 -2,以此类推。

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

my_list[-1]
Out[18]: 'Mar'

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

my_tuple[-1]
Out[20]: 'Mar'
3. 列表和元组都支持切片操作。

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

my_list[1:3]
Out[22]: [2, 3]

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

my_tuple[1:3]
Out[24]: (2, 3)
4. 列表和元组都支持遍历操作

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

for i in my_list:
    print(i)
1
2
3
Jan
Feb
Mar

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

for i in my_tuple:
    print(i)
1
2
3
Jan
Feb
Mar
修改
列表在创建完成后可以修改,元组在创建完成后不可修改。

列表

代码语言:txt
复制
my_list = [1, 2, 3, "Jan", "Feb", "Mar"]

my_list[0] = 4

my_list
Out[33]: [4, 2, 3, 'Jan', 'Feb', 'Mar']

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, "Jan", "Feb", "Mar")

my_tuple[0] = 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-aa9eb6c6a7e5> in <module>()
----> 1 my_tuple[0] = 4

TypeError: 'tuple' object does not support item assignment
存储

列表

代码语言:txt
复制
my_list = [1, 2, 3, 4, 5, 6]

my_list.__sizeof__()
Out[37]: 88

元组

代码语言:txt
复制
my_tuple = (1, 2, 3, 4, 5, 6)

my_tuple.__sizeof__()
Out[39]: 72

从例子中可以看出,在存储的元素相同时,列表需要的存储空间比元组要大,这是因为列表在存储元素的同时还要存储指向元素的指针。因此占用的存储空间要大。

性能

列表和元组在初始化以及访问的性能是怎样的呢?我们通过例子来看下。

1. 初始化
代码语言:txt
复制
python -m timeit "x=[1,2,3,4,5,6,7,8]"
5000000 loops, best of 5: 73 nsec per loop
python -m timeit "x=(1,2,3,4,5,6,7,8)"
20000000 loops, best of 5: 16.6 nsec per loop

从初始化的耗时可以看出,列表的初始化速度是元组的 4 倍多。

2. 访问
代码语言:txt
复制
python -m timeit -s "x=[1,2,3,4,5,6,7,8]" "y=x[3]"
10000000 loops, best of 5: 35.8 nsec per loop
python -m timeit -s "x=(1,2,3,4,5,6,7,8)" "y=x[3]"
10000000 loops, best of 5: 35.4 nsec per loop

从访问的耗时可以看出,列表和元组的速度差不多。

应用场景

由于元组在创建之后不可改变,因此比较适合存储的数据和数量不变的场景。例如,可以用元组来存储一年的月份名称:

代码语言:txt
复制
months_tuple = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

由于列表在创建之后允许改变,因此比较适合存储的数据和数量变化的场景。例如,可以用列表来存储商品的名称:

代码语言:txt
复制
product_list = ["apple", "pear", "banana"]
内置函数
列表

append() - Add an element to the end of the list

extend() - Add all elements of a list to the another list

insert() - Insert an item at the defined index

remove() - Removes an item from the list

pop() - Removes and returns an element at the given index

clear() - Removes all items from the list

index() - Returns the index of the first matched item

count() - Returns the count of the number of items passed as an argument

sort() - Sort items in a list in ascending order

reverse() - Reverse the order of items in the list

copy() - Returns a shallow copy of the list

代码语言:txt
复制
my_list = [1, 2, 3, 4, 5, 6]

my_list.append(7)

my_list
Out[33]: [1, 2, 3, 4, 5, 6, 7]

my_list.insert(2, 8)

my_list
Out[35]: [1, 2, 8, 3, 4, 5, 6, 7]

my_list.remove(8)

my_list
Out[37]: [1, 2, 3, 4, 5, 6, 7]

my_list.pop()
Out[38]: 7

my_list.pop(3)
Out[39]: 4

my_list
Out[40]: [1, 2, 3, 5, 6]

my_list.index(5)
Out[41]: 3

my_list2 = [1, 2, 3]

my_list.extend(my_list2)

my_list
Out[44]: [1, 2, 3, 5, 6, 1, 2, 3]

my_list.count(2)
Out[45]: 2

my_list.count(3)
Out[46]: 2

my_list.sort()

my_list
Out[48]: [1, 1, 2, 2, 3, 3, 5, 6]

my_list.reverse()

my_list
Out[50]: [6, 5, 3, 3, 2, 2, 1, 1]
元组

index() - Returns the index of the first matched item

count() - Returns the count of the number of items passed as an argument

代码语言:txt
复制
my_tuple = (1, 2, 3, 3, 4, 5)

my_tuple.count(3)
Out[52]: 2

my_tuple.index(5)
Out[53]: 5
总结

本文主要介绍了列表和元组的不同之处,了解了不同之处,使得我们在使用的时候可以选择最合适的数据结构。

封面:该图片由Gerd Altmann在Pixabay上发布

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建
    • 1. 列表和元组创建的语法不同。
      • 2. 列表和元组中的元素类型可以是任意类型,同一个列表或元组中的元素可以是不同类型的。
      • 访问
        • 1. 列表和元组都支持使用索引的方式进行访问,索引下标从 0 开始。
          • 2. 列表和元组都支持负数索引,负数索引从尾部开始,倒数第一个元素的索引为 -1 ,倒数第二个元素的索引为 -2,以此类推。
            • 3. 列表和元组都支持切片操作。
              • 4. 列表和元组都支持遍历操作
              • 修改
                • 列表在创建完成后可以修改,元组在创建完成后不可修改。
                • 存储
                • 性能
                  • 1. 初始化
                    • 2. 访问
                    • 应用场景
                    • 内置函数
                      • 列表
                        • 元组
                        • 总结
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档