集合类型

Python 中有许多集合类型。虽然 intstr 等类型包含单个值,但集合类型包含多个值。

清单

list 类型可能是 Python 中最常用的集合类型。尽管它的名字,列表更像是其他语言中的数组,主要是 JavaScript。在 Python 中,列表只是有效 Python 值的有序集合。可以通过在方括号中用逗号分隔值来创建列表:

int_list = [1, 2, 3]
string_list = ['abc', 'defghi']

列表可以为空:

empty_list = []

列表的元素不限于单个数据类型,这是合理的,因为 Python 是一种动态语言:

mixed_list = [1, 'abc', True, 2.34, None]

列表可以包含另一个列表作为其元素:

nested_list = [['a', 'b', 'c'], [1, 2, 3]]

可以通过索引或其位置的数字表示来访问列表的元素。Python 中的列表是*零索引的,*这意味着列表中的第一个元素位于索引 0 处,第二个元素位于索引 1 处,依此类推:

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']
print(names[0]) # Alice
print(names[2]) # Craig

指数也可以是负数,这意味着从列表的末尾开始计数(-1 是最后一个元素的索引)。因此,使用上面示例中的列表:

print(names[-1]) # Eric
print(names[-4]) # Bob

列表是可变的,因此你可以更改列表中的值:

names[0] = 'Ann'
print(names)
# Outputs ['Ann', 'Bob', 'Craig', 'Diana', 'Eric']

此外,可以从列表中添加和/或删除元素:

使用 L.append(object) 将对象附加到列表末尾,返回 None

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']
names.append("Sia")
print(names) 
# Outputs ['Alice', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

在特定索引处添加要列出的新元素。L.insert(index, object)

names.insert(1, "Nikki")
print(names)
# Outputs ['Alice', 'Nikki', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

使用 L.remove(value) 删除第一次出现的值,返回 None

names.remove("Bob")
print(names) # Outputs ['Alice', 'Nikki', 'Craig', 'Diana', 'Eric', 'Sia']

获取值为 x 的第一个项目列表中的索引。如果没有这样的项目,它将显示错误。

name.index("Alice")
0

计算列表的长度

len(names)
6

计算列表中任何项目的出现次数

a = [1, 1, 1, 2, 3, 4]
a.count(1)
3

翻转清单

a.reverse()
[4, 3, 2, 1, 1, 1]
# or
a[::-1]
[4, 3, 2, 1, 1, 1]

使用 L.pop([index]) 删除并返回索引处的项目(默认为最后一项),返回该项目

names.pop() # Outputs 'Sia'

你可以迭代列表元素,如下所示:

for element in my_list:
    print (element)

元组

tuple 类似于列表,除了它是固定长度和不可变的。因此,元组中的值不能更改,也不能将值添加到元组或从元组中删除。元组通常用于不需要更改的小型值集合,例如 IP 地址和端口。元组用括号表示而不是方括号:

ip_address = ('10.20.30.40', 8080)

列表的相同索引规则也适用于元组。元组也可以嵌套,值可以是任何有效的 Python 有效。

必须以这种方式定义只有一个成员的元组(注意逗号):

one_member_tuple = ('Only member',)

要么

one_member_tuple = 'Only member',   # No brackets

或者只是使用 tuple 语法

one_member_tuple = tuple(['Only member'])

字典

Python 中的 dictionary 是键值对的集合。字典被花括号包围。每对用逗号分隔,键和值用冒号分隔。这是一个例子:

state_capitals = {
    'Arkansas': 'Little Rock',
    'Colorado': 'Denver',
    'California': 'Sacramento', 
    'Georgia': 'Atlanta'
}

要获取值,请通过其键引用它:

ca_capital = state_capitals['California']

你还可以获取字典中的所有键,然后迭代它们:

for k in state_capitals.keys():
    print('{} is the capital of {}'.format(state_capitals[k], k))

字典非常类似于 JSON 语法。Python 标准库中的本机 json 模块可用于在 JSON 和字典之间进行转换。

set 是元素的集合,没有重复,没有插入顺序,但排序顺序。它们用于以下情况:将某些事物组合在一起非常重要,而不是包含它们的顺序。对于大型数据组,检查元素是否在 set 中要比对 list 执行相同操作要快得多。

定义 set 非常类似于定义 dictionary

first_names = {'Adam', 'Beth', 'Charlie'}

或者你可以使用现有的 list 构建一个 set

my_list = [1,2,3]
my_set = set(my_list)

使用 in 检查 set 的成员资格:

if name in first_names:
    print(name)

你可以像列表一样遍历 set,但请记住:值将以任意实现定义的顺序进行。

defaultdict

defaultdict 是一个具有键默认值的字典,因此可以无错误地访问未明确定义任何值的键。当字典中的值是集合(列表,字符串等)时,defaultdict 特别有用,因为每次使用新密钥时都不需要初始化它。

defaultdict 永远不会引发 KeyError。任何不存在的键都会返回默认值。

例如,请考虑以下字典

>>> state_capitals = {
    'Arkansas': 'Little Rock',
    'Colorado': 'Denver',
    'California': 'Sacramento', 
    'Georgia': 'Atlanta'
}

如果我们尝试访问一个不存在的键,python 会返回一个错误,如下所示

>>> state_capitals['Alabama']
Traceback (most recent call last):

  File "<ipython-input-61-236329695e6f>", line 1, in <module>
    state_capitals['Alabama']

KeyError: 'Alabama'

让我们尝试一下 defaultdict。它可以在 collections 模块中找到。

>>> from collections import defaultdict
>>> state_capitals = defaultdict(lambda: 'Boston')

我们在这里做的是设置一个默认值( 波士顿 ),以防 Give 键不存在。现在像以前一样填充 dict:

>>> state_capitals['Arkansas'] = 'Little Rock'
>>> state_capitals['California'] = 'Sacramento'
>>> state_capitals['Colorado'] = 'Denver'
>>> state_capitals['Georgia'] = 'Atlanta'

如果我们尝试使用不存在的密钥访问 dict,python 将返回默认值,即 Boston

>>> state_capitals['Alabama']
'Boston'

并返回现有键的创建值,就像普通的 dictionary 一样

>>> state_capitals['Arkansas']
'Little Rock'