Kaggle课程官方链接:Lists
本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。
列表以及你可以用它们做的事情。包括索引、切片和变异
Python中的列表表示值的有序序列。以下是一个如何创建它们的示例:
primes = [2, 3, 5, 7]
我们可以把其他类型的东西放在列表中:
planets = ['Mercury', 'Venus', 'Earth', 'Mars',
'Jupiter', 'Saturn', 'Uranus', 'Neptune']
我们甚至可以制作一个列表:
hands = [
['J', 'Q', 'K'],
['2', '2', '2'],
['6', 'A', 'K'], # (Comma after the last element is optional)
]
# (I could also have written this on one line, but it can get hard to read)
hands = [['J', 'Q', 'K'], ['2', '2', '2'], ['6', 'A', 'K']]
列表可以包含不同类型变量的组合:
my_favourite_things = [32, 'raindrops on roses', help]
# (Yes, Python's help function is *definitely* one of my favourite things)
您可以使用方括号访问单个列表元素。
哪颗行星离太阳最近?Python使用从零开始的索引,因此第一个元素的索引为0。
planets[0]
'Mercury'
下一个最近的行星是什么?
planets[1]
'Venus'
哪个星球离太阳最远?
列表末尾的元素可以用负数访问,从-1开始:
planets[-1]
'Neptune'
planets[-2]
'Uranus'
前三颗行星是什么?我们可以使用切片来回答这个问题:
planets[0:3]
['Mercury', 'Venus', 'Earth']
行星[0:3]是我们要求从索引0开始,一直到索引3(但不包括索引3)的行星元素的方式。
起始和结束索引都是可选的。如果我省略了开始索引,则假设它为0。
所以我可以把上面的表达式重写为:
planets[:3]
['Mercury', 'Venus', 'Earth']
如果我省略了结束索引,则假定它是列表的长度。
planets[3:]
['Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
也就是说,上面的表达式意味着“给我从索引3开始的所有行星”。
我们也可以在切片时使用负索引:
# All the planets except the first and last
planets[1:-1]
['Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus']
# The last 3 planets
planets[-3:]
['Saturn', 'Uranus', 'Neptune']
列表是“可变的”,这意味着它们可以“就地”修改。
修改列表的一种方法是为索引或切片表达式赋值。
例如,假设我们想重命名Mars:
planets[3] = 'Malacandra'
planets
['Mercury', 'Venus', 'Earth', 'Malacandra', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
嗯,那真是一口。让我们通过缩短前三颗行星的名称来弥补。
planets[:3] = ['Mur', 'Vee', 'Ur']
print(planets)
# That was silly. Let's give them back their old names
planets[:4] = ['Mercury', 'Venus', 'Earth', 'Mars',]
['Mur', 'Vee', 'Ur', 'Malacandra', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
Python有几个用于处理列表的有用函数。
len给出列表的长度:
# How many planets are there?
len(planets)
8
sorted返回列表的排序版本:
# The planets sorted in alphabetical order
sorted(planets)
['Earth', 'Jupiter', 'Mars', 'Mercury', 'Neptune', 'Saturn', 'Uranus', 'Venus']
sum做到了你所期望的:
primes = [2, 3, 5, 7]
sum(primes)
17
我们之前使用min和max来获取几个参数的最小值或最大值。但我们也可以传递一个列表参数。
max(primes)
7
到目前为止,我已经使用了很多“对象”一词——你甚至可能已经读到Python中的一切都是对象。这是什么意思?
简而言之,物体会随身携带一些东西。您可以使用Python的点语法访问这些内容。
例如,Python中的数字带有一个名为imag的关联变量,表示它们的虚部。(除非你在做一些非常奇怪的数学运算,否则你可能永远不需要使用这个。)
x = 12
# x is a real number, so its imaginary part is 0.
print(x.imag)
# Here's how to make a complex number, in case you've ever been curious:
c = 12 + 3j
print(c.imag)
0 3.0
物体携带的东西也可以包括功能。附加到对象的函数称为方法。(附加到对象的非功能对象,如imag,称为属性)。
例如,数字有一个名为bit_length的方法。同样,我们使用点语法访问它:
x.bit_length
要实际调用它,我们添加括号:
x.bit_length()
4
旁白:如果你一直在做练习,你实际上已经在调用方法了。在练习本q1、q2、q3等中,所有对象都有称为check、hint和solution的方法。
就像我们可以将函数传递给help函数(例如help(max))一样,我们也可以传入方法:
help(x.bit_length)
Help on built-in function bit_length: bit_length() method of builtins.int instance Number of bits necessary to represent self in binary. >>> bin(37) '0b100101' >>> (37).bit_length() 6
上面的例子完全晦涩难懂。到目前为止,我们研究过的所有类型的对象(数字、函数、布尔值)都没有你可能会使用的属性或方法。
但事实证明,列表有几种方法,你会一直使用。
list.append通过在末尾添加项目来修改列表:
# Pluto is a planet darn it!
planets.append('Pluto')
为什么上面的单元格没有输出?让我们通过调用help(planes.append)来检查文档。
旁白:append是所有list类型的对象都携带的方法,而不仅仅是行星,所以我们也可以调用help(list.append)。但是,如果我们尝试调用help(append),Python会抱怨不存在名为“append”的变量。“append”名称仅存在于列表中,它不像内置函数(如max或len)那样作为独立名称存在。
help(planets.append)
Help on built-in function append: append(object, /) method of builtins.list instance Append object to the end of the list.
->None部分告诉我们list.append不返回任何内容。但是如果我们检查行星的值,我们可以看到方法调用修改了行星的值:
planets
['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune', 'Pluto']
list.pop删除并返回列表的最后一个元素:
planets.pop()
'Pluto'
planets
['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
地球按行星顺序在哪里?我们可以使用list.index方法获取它的索引。
planets.index('Earth')
2
它排在第三位(即索引为2-0!)。
冥王星出现在什么指数?
planets.index('Pluto')
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) /tmp/ipykernel_19/2263615293.py in----> 1 planets.index('Pluto') ValueError: 'Pluto' is not in list
哦,没错。。。
为了避免像这样令人不快的意外,我们可以使用in运算符来确定列表是否包含特定值:
# Is Earth a planet?
"Earth" in planets
True
# Is Calbefraques a planet?
"Calbefraques" in planets
False
还有一些我们没有介绍的更有趣的列表方法。如果你想了解附加到特定对象的所有方法和属性,我们可以对对象本身调用help()。例如,help(行星)将告诉我们所有列表方法:
help(planets)
Help on list object: class list(object) | list(iterable=(), /) | | Built-in mutable sequence. | | If no argument is given, the constructor creates a new empty list. | The argument must be an iterable if specified. | | Methods defined here: | | __add__(self, value, /) | Return self+value. | | __contains__(self, key, /) | Return key in self. | | __delitem__(self, key, /) | Delete self[key]. | | __eq__(self, value, /) | Return self==value. | | __ge__(self, value, /) | Return self>=value. | | __getattribute__(self, name, /) | Return getattr(self, name). | | __getitem__(...) | x.__getitem__(y) <==> x[y] | | __gt__(self, value, /) | Return self>value. | | __iadd__(self, value, /) | Implement self+=value. | | __imul__(self, value, /) | Implement self*=value. | | __init__(self, /, *args, **kwargs) | Initialize self. See help(type(self)) for accurate signature. | | __iter__(self, /) | Implement iter(self). | | __le__(self, value, /) | Return self<=value. | | __len__(self, /) | Return len(self). | | __lt__(self, value, /) | Return self
列表中有很多方法,它们的名字看起来很奇怪,比如__eq__和__iadd__。现在不要太担心这些。(你可能永远不会直接调用这些方法。但当我们使用索引或比较运算符等语法时,它们会在幕后被调用。)最有趣的方法位于列表的底部(append、clear、copy等)。
元组几乎与列表完全相同。它们仅在两个方面有所不同。
1:创建它们的语法使用括号而不是方括号
t = 1, 2, 3 # equivalent to above
t
(1, 2, 3)
2:它们不能被修改(它们是不可变的)。
t[0] = 100
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /tmp/ipykernel_19/816329950.py in----> 1 t[0] = 100 TypeError: 'tuple' object does not support item assignment
元组通常用于具有多个返回值的函数。
例如,float对象的as_integer_ratio()方法以元组的形式返回分子和分母:
x = 0.125
x.as_integer_ratio()
(1, 8)
这些多个返回值可以按如下方式单独分配:
numerator, denominator = x.as_integer_ratio()
print(numerator / denominator)
0.125
最后,我们对交换两个变量的经典愚蠢Python技巧有了一些了解!
a = 1
b = 0
a, b = b, a
print(a, b)
0 1
你最好通过写代码来学习,而不仅仅是阅读。所以现在就试试编码挑战吧。