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

1. python 基本数据类型

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

  • Number(数字)

  • String(字符串)

  • Tuple(元组)

  • List(列表)

  • Set(集合)

  • Dictionary(字典)

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

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

2. 数据类型各自的特点

2.1 数组与 列表

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

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

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

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

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

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

  1. 注意 将一个 不可变类型字符串 转化为 数组时, 使用
    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)
# 节点对象 <ListNode object at 0x1058fd810> 的哈希值为 274267521

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

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

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

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

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

2.4 元组

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值