Skip to content

Latest commit

 

History

History
596 lines (469 loc) · 17.5 KB

05_lists.md

File metadata and controls

596 lines (469 loc) · 17.5 KB

30 天 Python:第五天 - Lists

Twitter Follow

作者: Asabeneh Yetayeh
第二版:2021 年 7 月

<< 第四天 | 第六天 >>

30DaysOfPython

第五天

列表

Python 中有四种集合数据类型:

  • List:有序且可变的集合。允许重复的成员。
  • Tuple:有序且不可变的集合。允许重复的成员。
  • Set:无序、不可索引且不可变的集合,但我们可以向集合中添加新项。不允许重复的成员。
  • Dictionary:无序、可变且可索引的集合。不允许重复的成员。

列表是不同数据类型的集合,有序且可修改(可变)。列表可以为空,也可以包含不同数据类型的项。

如何创建列表

在 Python 中,我们可以通过两种方式创建列表:

  • 使用内置函数 list()
# 语法
lst = list()
empty_list = list() # 这是一个空列表
print(len(empty_list)) # 0
  • 使用方括号,[]
# 语法
lst = []
empty_list = [] # 这是一个空列表
print(len(empty_list)) # 0

具有初始值的列表。我们使用 len() 来检查列表的长度。

fruits = ['banana', 'orange', 'mango', 'lemon']                     # list of fruits
vegetables = ['Tomato', 'Potato', 'Cabbage','Onion', 'Carrot']      # list of vegetables
animal_products = ['milk', 'meat', 'butter', 'yoghurt']             # list of animal products
web_techs = ['HTML', 'CSS', 'JS', 'React','Redux', 'Node', 'MongDB'] # list of web technologies
countries = ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway']

# 打印列表及其长度
print('Fruits:', fruits)
print('Number of fruits:', len(fruits))
print('Vegetables:', vegetables)
print('Number of vegetables:', len(vegetables))
print('Animal products:',animal_products)
print('Number of animal products:', len(animal_products))
print('Web technologies:', web_techs)
print('Number of web technologies:', len(web_techs))
print('Countries:', countries)
print('Number of countries:', len(countries))
输出
Fruits: ['banana', 'orange', 'mango', 'lemon']
Number of fruits: 4
Vegetables: ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
Number of vegetables: 5
Animal products: ['milk', 'meat', 'butter', 'yoghurt']
Number of animal products: 4
Web technologies: ['HTML', 'CSS', 'JS', 'React', 'Redux', 'Node', 'MongDB']
Number of web technologies: 7
Countries: ['Finland', 'Estonia', 'Denmark', 'Sweden', 'Norway']
Number of countries: 5
  • 列表可以包含不同数据类型的项
 lst = ['Asabeneh', 250, True, {'country':'Finland', 'city':'Helsinki'}] # 包含不同数据类型的列表

使用正索引访问列表项

我们使用索引访问列表中的每个项。列表索引从 0 开始。下图清楚地显示了索引从哪里开始。

List index

fruits = ['banana', 'orange', 'mango', 'lemon']
first_fruit = fruits[0] # 我们正在使用其索引访问第一项
print(first_fruit)      # banana
second_fruit = fruits[1]
print(second_fruit)     # orange
last_fruit = fruits[3]
print(last_fruit) # lemon
# Last index
last_index = len(fruits) - 1
last_fruit = fruits[last_index]

使用负索引访问列表项

负索引意味着从末尾开始,-1 指的是最后一项,-2 指的是倒数第二项。

List negative indexing

fruits = ['banana', 'orange', 'mango', 'lemon']
first_fruit = fruits[-4]
last_fruit = fruits[-1]
second_last = fruits[-2]
print(first_fruit)      # banana
print(last_fruit)       # lemon
print(second_last)      # mango

拆解列表项

lst = ['item1','item2','item3', 'item4', 'item5']
first_item, second_item, third_item, *rest = lst
print(first_item)     # item1
print(second_item)    # item2
print(third_item)     # item3
print(rest)           # ['item4', 'item5']
# 示例一
fruits = ['banana', 'orange', 'mango', 'lemon','lime','apple']
first_fruit, second_fruit, third_fruit, *rest = fruits 
print(first_fruit)     # banana
print(second_fruit)    # orange
print(third_fruit)     # mango
print(rest)           # ['lemon','lime','apple']
# 示例二
first, second, third,*rest, tenth = [1,2,3,4,5,6,7,8,9,10]
print(first)          # 1
print(second)         # 2
print(third)          # 3
print(rest)           # [4,5,6,7,8,9]
print(tenth)          # 10
# 示例三
countries = ['Germany', 'France','Belgium','Sweden','Denmark','Finland','Norway','Iceland','Estonia']
gr, fr, bg, sw, *scandic, es = countries
print(gr)
print(fr)
print(bg)
print(sw)
print(scandic)
print(es)

列表切分

  • 正索引:我们可以通过指定开始、结束和步长来指定一系列正索引,返回值将是一个新列表。 (开始默认值为 0,结束默认值为 len(lst) - 1(最后一项),步长默认值为 1)
fruits = ['banana', 'orange', 'mango', 'lemon']
all_fruits = fruits[0:4] # 返回所有项
#与上面返回值相同
all_fruits = fruits[0:] # 如果不指定结束索引,将返回从开始到最后一项的所有项
orange_and_mango = fruits[1:3] # 不包含第一项
orange_mango_lemon = fruits[1:]
orange_and_lemon = fruits[::2] # 我们使用了第三个参数,步长。 每两项取一条 - ['banana', 'mango']
  • 负索引:我们可以通过指定开始、结束和步长来指定一系列负索引,返回值将是一个新列表。
fruits = ['banana', 'orange', 'mango', 'lemon']
all_fruits = fruits[-4:] # 返回所有项
orange_and_mango = fruits[-3:-1] # 不包含最后一项,['orange', 'mango']
orange_mango_lemon = fruits[-3:] # 返回从-3到末尾的项,['orange', 'mango', 'lemon']
reverse_fruits = fruits[::-1] # 负步长将按相反顺序排列列表,['lemon', 'mango', 'orange', 'banana']

修改列表

列表是一个可变或可修改的有序集合。下面我们修改 fruit 列表。

fruits = ['banana', 'orange', 'mango', 'lemon']
fruits[0] = 'avocado'
print(fruits)       #  ['avocado', 'orange', 'mango', 'lemon']
fruits[1] = 'apple'
print(fruits)       #  ['avocado', 'apple', 'mango', 'lemon']
last_index = len(fruits) - 1
fruits[last_index] = 'lime'
print(fruits)        #  ['avocado', 'apple', 'mango', 'lime']

检索列表项

使用 in 运算符检查列表项是否为列表的成员。请参阅下面的示例。

fruits = ['banana', 'orange', 'mango', 'lemon']
does_exist = 'banana' in fruits
print(does_exist)  # True
does_exist = 'lime' in fruits
print(does_exist)  # False

添加列表项

要将项添加到现有列表的末尾,我们使用 append() 方法。

# 语法
lst = list()
lst.append(item)
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.append('apple')
print(fruits)           # ['banana', 'orange', 'mango', 'lemon', 'apple']
fruits.append('lime')   # ['banana', 'orange', 'mango', 'lemon', 'apple', 'lime']
print(fruits)

插入列表项

我们可以使用 insert() 方法在列表中的指定索引处插入单个项。请注意,其他项将向右移动。insert() 方法接受两个参数:索引和要插入的项。

# 语法
lst = ['item1', 'item2']
lst.insert(index, item)
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.insert(2, 'apple') # 在 orange 。 mango 中插入 apple
print(fruits)           # ['banana', 'orange', 'apple', 'mango', 'lemon']
fruits.insert(3, 'lime')   # ['banana', 'orange', 'apple', 'lime', 'mango', 'lemon']
print(fruits)

移除列表项

  • 使用 remove() 方法从列表中删除指定的项
# 语法
lst = ['item1', 'item2']
lst.remove(item)
fruits = ['banana', 'orange', 'mango', 'lemon', 'banana']
fruits.remove('banana')
print(fruits)  # ['orange', 'mango', 'lemon', 'banana'] - 此方法删除列表中第一次出现的项
fruits.remove('lemon')
print(fruits)  # ['orange', 'mango', 'banana']

使用 Pop 删除列表项

使用 pop() 方法删除指定索引(如果未指定索引,则删除最后一项):

# 语法
lst = ['item1', 'item2']
lst.pop()       # 最后一项
lst.pop(index)
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.pop()
print(fruits)       # ['banana', 'orange', 'mango']

fruits.pop(0)
print(fruits)       # ['orange', 'mango']

使用 Del 删除列表项

使用 del 关键字删除指定索引,也可以用于删除索引范围内的项。它还可以完全删除列表

# 语法
lst = ['item1', 'item2']
del lst[index] # 只删除一项
del lst        # 删除整个列表
fruits = ['banana', 'orange', 'mango', 'lemon', 'kiwi', 'lime']
del fruits[0]
print(fruits)       # ['orange', 'mango', 'lemon', 'kiwi', 'lime']
del fruits[1]
print(fruits)       # ['orange', 'lemon', 'kiwi', 'lime']
del fruits[1:3]     # 这将删除给定索引之间的项,因此不会删除索引为 3 的项!
print(fruits)       # ['orange', 'lime']
del fruits
print(fruits)       # 这里会提示: NameError: name 'fruits' is not defined

清空列表项

使用 clear() 方法清空列表:

# 语法
lst = ['item1', 'item2']
lst.clear()
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.clear()
print(fruits)       # []

列表复制

可以通过将其重新分配给新变量来复制列表: list2 = list1。现在,list2 是 list1 的引用,我们对 list2 进行的任何更改也将修改原始的 list1。但是有很多时候我们不想修改原始的列表,而是想要一个不同的副本。为了避免这个问题,我们使用 copy()

# 语法
lst = ['item1', 'item2']
lst_copy = lst.copy()
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits_copy = fruits.copy()
print(fruits_copy)       # ['banana', 'orange', 'mango', 'lemon']

连接列表

有几种方法可以连接或连接两个或多个列表。

  • 加号 (+)
# 语法
list3 = list1 + list2
positive_numbers = [1, 2, 3, 4, 5]
zero = [0]
negative_numbers = [-5,-4,-3,-2,-1]
integers = negative_numbers + zero + positive_numbers
print(integers) # [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']
vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
fruits_and_vegetables = fruits + vegetables
print(fruits_and_vegetables ) # ['banana', 'orange', 'mango', 'lemon', 'Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
  • 使用 extend() 方法 extend() 方法可以将列表附加到列表中。请参阅下面的示例。
# 语法
list1 = ['item1', 'item2']
list2 = ['item3', 'item4', 'item5']
list1.extend(list2)
num1 = [0, 1, 2, 3]
num2= [4, 5, 6]
num1.extend(num2)
print('Numbers:', num1) # Numbers: [0, 1, 2, 3, 4, 5, 6]
negative_numbers = [-5,-4,-3,-2,-1]
positive_numbers = [1, 2, 3,4,5]
zero = [0]

negative_numbers.extend(zero)
negative_numbers.extend(positive_numbers)
print('Integers:', negative_numbers) # Integers: [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
fruits = ['banana', 'orange', 'mango', 'lemon']
vegetables = ['Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']
fruits.extend(vegetables)
print('Fruits and vegetables:', fruits ) # Fruits and vegetables: ['banana', 'orange', 'mango', 'lemon', 'Tomato', 'Potato', 'Cabbage', 'Onion', 'Carrot']

统计列表项

使用 count() 方法返回列表中指定项出现的次数:

# 语法
lst = ['item1', 'item2']
lst.count(item)
fruits = ['banana', 'orange', 'mango', 'lemon']
print(fruits.count('orange'))   # 1
ages = [22, 19, 24, 25, 26, 24, 25, 24]
print(ages.count(24))           # 3

查找项的索引

index() 方法返回列表中项的索引:

# 语法
lst = ['item1', 'item2']
lst.index(item)
fruits = ['banana', 'orange', 'mango', 'lemon']
print(fruits.index('orange'))   # 1
ages = [22, 19, 24, 25, 26, 24, 25, 24]
print(ages.index(24))           # 2, 第一次出现

列表反转

使用 reverse() 方法反转列表的顺序。

# 语法
lst = ['item1', 'item2']
lst.reverse()
fruits = ['banana', 'orange', 'mango', 'lemon']
fruits.reverse()
print(fruits) # ['lemon', 'mango', 'orange', 'banana']
ages = [22, 19, 24, 25, 26, 24, 25, 24]
ages.reverse()
print(ages) # [24, 25, 24, 26, 25, 24, 19, 22]

列表排序

要对列表进行排序,我们可以使用 sort() 方法或内置函数 sorted()sort() 方法将列表项按升序重新排序并修改原始列表。如果 sort() 方法的 reverse 参数为 true,则会按降序排列列表。

  • sort(): 这个方法会修改原始列表

    # 语法
    lst = ['item1', 'item2']
    lst.sort()                # ascending
    lst.sort(reverse=True)    # descending

    示例:

    fruits = ['banana', 'orange', 'mango', 'lemon']
    fruits.sort()
    print(fruits)             # 按字母排序, ['banana', 'lemon', 'mango', 'orange']
    fruits.sort(reverse=True)
    print(fruits) # ['orange', 'mango', 'lemon', 'banana']
    ages = [22, 19, 24, 25, 26, 24, 25, 24]
    ages.sort()
    print(ages) #  [19, 22, 24, 24, 24, 25, 25, 26]
    
    ages.sort(reverse=True)
    print(ages) #  [26, 25, 25, 24, 24, 24, 22, 19]

    sorted(): 不会修改原始列表,而是返回一个新列表

    示例:

    fruits = ['banana', 'orange', 'mango', 'lemon']
    print(sorted(fruits))   # ['banana', 'lemon', 'mango', 'orange']
    # Reverse order
    fruits = ['banana', 'orange', 'mango', 'lemon']
    fruits = sorted(fruits,reverse=True)
    print(fruits)     # ['orange', 'mango', 'lemon', 'banana']

🌕 你很勤奋,已经取得了很多成就。你刚刚完成了第 5 天的挑战,并且已经朝着伟大的目标迈出了 5 步。现在做一些练习来锻练你的大脑和肌肉。

💻 练习 - 第五天

练习: 1级

  1. 声明一个空列表

  2. 声明一个包含 5 个以上项的列表

  3. 查找列表的长度

  4. 获取列表的第一项、中间项和最后一项

  5. 声明一个名为 mixed_data_types 的列表,包含你的姓名、年龄、身高、婚姻状况和地址

  6. 声明一个名为 it_companies 的列表,并分配初始值 Facebook、Google、Microsoft、Apple、IBM、Oracle 和 Amazon。

  7. 使用 print() 打印列表

  8. 打印列表中的公司数

  9. 打印第一、中间和最后一家公司

  10. 修改其中一家公司的名称后打印列表

  11. 向 it_companies 添加一家 IT 公司

  12. 在公司列表中间插入一家 IT 公司

  13. 将其中一家 it_companies 公司的名称更改为大写(不包括 IBM!)

  14. 使用字符串 '#;  ' 连接 it_companies

  15. 检查 it_companies 列表中是否存在某个公司。

  16. 使用 sort() 方法对列表进行排序

  17. 使用 reverse() 方法按降序反转列表

  18. 从列表中切分出前 3 家公司

  19. 从列表中切分出最后 3 家公司

  20. 从列表中切分出中间的 IT 公司或公司

  21. 从列表中删除第一家 IT 公司

  22. 从列表中删除中间的 IT 公司或公司

  23. 从列表中删除最后一家 IT 公司

  24. 从列表中删除所有 IT 公司

  25. 销毁 it_companies 列表

  26. 连接以下列表:

    front_end = ['HTML', 'CSS', 'JS', 'React', 'Redux']
    back_end = ['Node','Express', 'MongoDB']
  27. 在连接的列表中插入 Python 和 SQL 到变量 full_stack 之后。

练习: 2级

  1. 以下是 10 个学生的年龄列表:
ages = [19, 22, 19, 24, 20, 25, 26, 24, 25, 24]
  • 对列表进行排序,并找出最大和最小年龄
  • 将最小年龄和最大年龄再次添加到列表中
  • 找到年龄中位数(一个中间项或两个中间项除以二)
  • 找到平均年龄(所有项的总和除以它们的数量)
  • 找到年龄范围(最大减去最小)
  • 比较 (min - average) 和 (max - average) 的值,使用 abs() 方法
  1. 国家列表 中查找中间的国家
  2. 将国家列表分成两个相等的列表(如果是偶数,如果不是,则第一个半多一个国家)
  3. ['China', 'Russia', 'USA', 'Finland', 'Sweden', 'Norway', 'Denmark']。拆解前三个国家和剩下的北欧国家。

🎉 恭喜 ! 🎉

<< 第四天 | 第六天 >>