编程小白冲Kaggle每日打卡(8)--kaggle学堂:<Python>列表

Kaggle课程官方链接:Lists

本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。

Lists¶

列表以及你可以用它们做的事情。包括索引、切片和变异

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)

Indexing

您可以使用方括号访问单个列表元素。

哪颗行星离太阳最近?Python使用从零开始的索引,因此第一个元素的索引为0。

planets[0]

'Mercury'

下一个最近的行星是什么?

planets[1]
'Venus'

哪个星球离太阳最远?

列表末尾的元素可以用负数访问,从-1开始:

planets[-1]
'Neptune'
planets[-2]
'Uranus'

Slicing

前三颗行星是什么?我们可以使用切片来回答这个问题:

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']

Changing lists

列表是“可变的”,这意味着它们可以“就地”修改。

修改列表的一种方法是为索引或切片表达式赋值。

例如,假设我们想重命名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']

List functions

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

Interlude: objects

到目前为止,我已经使用了很多“对象”一词——你甚至可能已经读到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 methods

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']

Searching lists

地球按行星顺序在哪里?我们可以使用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等)。

Tuples

元组几乎与列表完全相同。它们仅在两个方面有所不同。

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

Your Turn


你最好通过写代码来学习,而不仅仅是阅读。所以现在就试试编码挑战吧。

你可能感兴趣的:(编程小白冲Kaggle每日打卡,python,windows,开发语言)