概念一: python 中列表 ,数组, 集合,字典; 您所在的位置:网站首页 数据字典和数字字典一样吗 概念一: python 中列表 ,数组, 集合,字典;

概念一: python 中列表 ,数组, 集合,字典;

2024-07-11 13:30| 来源: 网络整理| 查看: 265

1. python 基本数据类型

首先python3 中 自带的 有 六个标准的数据结构类型:

Number(数字)

String(字符串)

Tuple(元组)

List(列表)

Set(集合)

Dictionary(字典)

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);

可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

2. 数据类型各自的特点 2.1 数组与 列表

array 数组 []: 其中的 所有元素 必须是 同一类型的 元素;

list 列表 []: 创建时使用 your_list = [ ] , 其中的元素 可以 是不同的的 类型, 它支持数字,字符串甚至可以包含列表(所谓嵌套)

列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。

链表天然可以看作一个列表,其支持元素增删查改操作,并且可以灵活动态扩容。数组也支持元素增删查改,但由于其长度不可变,因此只能看作一个具有长度限制的列表。 当使用数组实现列表时,长度不可变的性质会导致列表的实用性降低。这是因为我们通常无法事先确定需要存储多少数据,从而难以选择合适的列表长度。若长度过小,则很可能无法满足使用需求;若长度过大,则会造成内存空间浪费。

为解决此问题,我们可以使用动态数组(dynamic array)来实现列表。它继承了数组的各项优点,并且可以在程序运行过程中进行动态扩容。

实际上,许多编程语言中的标准库提供的列表是基于动态数组实现的,例如 Python 中的 list 、Java 中的 ArrayList 、C++ 中的 vector 和 C# 中的 List 等。在接下来的讨论中,我们将把“列表”和“动态数组”视为等同的概念。

注意 将一个 不可变类型字符串 转化为 数组时, 使用 str2list = list( you_str); 使用 (); 2.2 集合 set()

集合 set(): 集合中的 元素不能有重复性的, 即python 中 集合本身便是具备了去重的功能;

注意: 集合中的元素可以是列表, 而列表中的元素是可以重复的, 只要各个列表不同即可;

基本功能是进行成员关系测试和删除重复元素。

集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。

可以使用大括号 { } 或者 set() 函数创建集合, 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

2.3 字典

字典(dictionary)是Python中另一个非常有用的内置数据类型。 字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。

键(key)必须使用不可变类型。 在同一个字典中,键(key)必须是唯一的。

在 Python 字典中,键和值的类型可以是任意的,但为了使字典正常运行,必须满足键的特定要求和注意事项。

2.3.1 key Key Requirements 对key 的要求 Hashable:可哈希的, 这包括了,Immutable types like strings, numbers, and tuples (containing only hashable elements) are hashable.字符串、数字和元组(仅包含可哈希元素)等不可变类型是可哈希的。

Keys must be hashable, meaning that they must have a hash value that does not change during their lifetime. This allows Python to use the hash value to quickly compare dictionary keys.键必须是可散列的,这意味着它们必须具有在其生命周期内不会更改的散列值。这使得Python可以使用哈希值来快速比较字典键。

Equality Comparison:平等比较:

Keys must support equality comparison. This is used to determine if two keys are the same. 键必须支持相等比较。这用于确定两个密钥是否相同。

Examples of valid keys:有效key 的示例:

Integers: 1, 2, 3整数: 1, 2, 3 Strings: “apple”, "banana"字符串: “apple”, “banana” Tuples (with hashable elements): (1, 2), (“key”, 3)元组(带有可散列元素): (1, 2), (“key”, 3)

Examples of invalid keys:无效key 的示例: Lists: [1, 2, 3] (lists are mutable and thus not hashable)列表: [1, 2, 3] (列表是可变的,因此不可散列) Dictionaries: {1: ‘a’} (dictionaries are mutable and not hashable)字典: {1: ‘a’} (字典是可变的且不可散列)

2.3.2 value Value Requirements价值要求 There are no restrictions on the types of values in a dictionary. Values can be of any type, including mutable types like lists and dictionaries, or even other dictionaries.字典中的值的类型没有限制。值可以是任何类型,包括可变类型,例如列表和字典,甚至其他字典。 Example of Arbitrary Key and Value Types任意键和值类型的示例

Here are some examples demonstrating various key and value types in Python dictionaries:以下是一些示例,演示了 Python 字典中的各种键和值类型:

# Valid dictionary with different types of keys and values example_dict = { 1: "apple", # Integer key, string value "banana": [1, 2, 3], # String key, list value (2, 3): {"nested": "dict"}, # Tuple key, dictionary value } # Accessing values using different types of keys print(example_dict[1]) # Output: apple print(example_dict["banana"]) # Output: [1, 2, 3] print(example_dict[(2, 3)]) # Output: {'nested': 'dict'} # Example of an invalid key type # This will raise a TypeError: unhashable type: 'list' try: invalid_dict = { [1, 2, 3]: "value" # List key, which is not allowed } except TypeError as e: print(f"Error: {e}") # Example of an invalid key type # This will raise a TypeError: unhashable type: 'dict' try: invalid_dict = { {1: 'a'}: "value" # Dictionary key, which is not allowed } except TypeError as e: print(f"Error: {e}") 2.3.3 hash

我们知道,哈希表的 key 可以是整数、小数或字符串等数据类型。编程语言通常会为这些数据类型提供内置的哈希算法,用于计算哈希表中的桶索引。以 Python 为例,我们可以调用 hash() 函数来计算各种数据类型的哈希值。

整数和布尔量的哈希值就是其本身。 浮点数和字符串的哈希值计算较为复杂,有兴趣的读者请自行学习。 元组的哈希值是对其中每一个元素进行哈希,然后将这些哈希值组合起来,得到单一的哈希值。 对象的哈希值基于其内存地址生成。通过重写对象的哈希方法,可实现基于内容生成哈希值。

num = 3 hash_num = hash(num) # 整数 3 的哈希值为 3 bol = True hash_bol = hash(bol) # 布尔量 True 的哈希值为 1 dec = 3.14159 hash_dec = hash(dec) # 小数 3.14159 的哈希值为 326484311674566659 str = "Hello 算法" hash_str = hash(str) # 字符串“Hello 算法”的哈希值为 4617003410720528961 tup = (12836, "小哈") hash_tup = hash(tup) # 元组 (12836, '小哈') 的哈希值为 1029005403108185979 obj = ListNode(0) hash_obj = hash(obj) # 节点对象 的哈希值为 274267521

在许多编程语言中,只有不可变对象才可作为哈希表的 key 。假如我们将列表(动态数组)作为 key ,当列表的内容发生变化时,它的哈希值也随之改变,我们就无法在哈希表中查询到原先的 value 了。

虽然自定义对象(比如链表节点)的成员变量是可变的,但它是可哈希的。这是因为对象的哈希值通常是基于内存地址生成的,即使对象的内容发生了变化,但它的内存地址不变,哈希值仍然是不变的。

细心的你可能发现在不同控制台中运行程序时,输出的哈希值是不同的。这是因为 Python 解释器在每次启动时,都会为字符串哈希函数加入一个随机的盐(salt)值。这种做法可以有效防止 HashDoS 攻击,提升哈希算法的安全性。

列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

2.4 元组

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。 元组写在小括号 () 里,元素之间用逗号隔开。

元组中的元素类型也可以不相同: tuple = ( ‘abcd’, 786 , 2.23, ‘runoob’, 70.2 )



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有