python中随机数,序列极其基本操作,enumerate()枚举,列表及其操作,元组tuple的创建和遍历

1 . python随机数的生成
例如1-100间的int

import random
ran=random.randint(1,100)

2.序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。

序列包括五种数据类型:字符串,列表,元组,(有序序列)字典,集合(无序序列)

序列包括四种组合数据类型:
列表,元组,(有序序列)字典,集合(无序序列)

在这里插入图片描述
①切片操作

在这里插入图片描述

步长可以为负数,s[::-1]可以对s进行逆序输出,=s[-1:-N:-1]

②序列可以相加相乘例如字符串相加连接,*n可以重复n次,此外

在这里插入图片描述


列表list----可变数据类型——操作后元素数量可以改变但是元素的存储位置不变

列表(List)是一种动态数组数据结构在Python等语言中,它不是基于哈希表实现的。列表之所以不需要哈希是因为其元素的存储和访问方式:

顺序存储:列表内的元素按照插入的顺序线性排列,通过索引(从0开始)直接访问,这与哈希表的随机查找(通过键计算哈希值确定位置)不同。

无固定大小:列表可以动态地改变大小,即在需要时添加或删除元素,而无需预设容量。哈希表通常有固定的容量,当元素超过一定数量时,需要调整底层哈希表的结构。

遍历操作:对于列表,常见的遍历操作如就是基于顺序的,而哈希表更常用于快速查找和插入操作,适合一次性找到特定键对应的值。for i in list:

虽然列表不依赖哈希提供高效的查找速度,但在某些场景下,如果需要快速查找元素,尤其是对大量数据进行频繁查找的情况下,哈希表会更有优势。例如,字典(Dictionary)在Python中就是一个基于哈希实现的数据结构。

1.列表的创建

在这里插入图片描述

  1. enumerate() 是python的内置函数,将一个可遍历iterable数据对象(如list列表、tuple元组或str字符串)组合为一个索引序列,同时列出数据和数据下标(自定义,默认为0),一般用在for循环当中。
    语法: enumerate(sequence, [start=0])
lis=['world',123,11,'hello']
print(lis)

lis2=list('hello')
lis3=list(range(1,10,2))
print(lis2,lis3)

for index,item in enumerate(lis3,start=1):
    print(index,item)

在这里插入图片描述

3.列表的操作–增删改查

在这里插入图片描述

remove(item)方法和pop(index)方法的区别:

remove(item)方法是直接对可变序中的元素进行检索删除,直接删除列标中的第一个item,不返回删除值(返回None)
pop(index)方法是对可变序列中元素下标进行检索删除,返回删除值

4.列表的排序
在这里插入图片描述

sort排序是在原列表位置进行,不会更改和复制新的,sorted需要新对象

lis3.sort()
print(lis3)

new_list3=sorted(lis3,reverse=True)
print(new_list3)

#[1, 3, 5, 7, 9]
#[9, 7, 5, 3, 1]
  1. 列表生成式
    在这里插入图片描述
lis4=[i for i in range(1,10) if i%2==0]
print(lis4)  #[2, 4, 6, 8]

6.多维数组

lis5=[ 
    ['world',123,11,'hello'],
    ['world',123,11,'hello'],
    ['world',123,11,'hello'],
     ]
print(lis5)

lis6=[[for j in range(5)] for i in range(4) if i%2==0]  #五列四行

for row in lis5:
    for item in row:
        print(item,end='\t')
    print()

元组tuple----不可变数据类型——没有增删改查等操作,只能获取和遍历

  1. 如果元组中只有一个元素,用t=tuple(1)创建后,这个1十一个int类型而不是元组类型,需要加一个,例如t=tuple(1,)
    同样可以用enumerate()来枚举获得index和item
    在这里插入图片描述
t=('niu',12,34)
print(t[0])

t2=t[0:2]       #可以切片
print(t2)
for i in t:
    print(i)

结果:
niu
(‘niu’, 12)
niu
12
34

  1. 元组生成式
t = (i for i in range(100)) 

生成的t是一个生成器对象<generator object <genexpr> at 0x00000285C4196D40>遍历过一遍后对象就不存在元素了,它不是一个元组类型

生成器对象是一种延迟计算的序列,它会在需要时逐个产生值。这与列表、元组等容器对象不同,后者会在创建时就将所有的元素都存储在内存中。
生成器对象的优点在于它可以大大减少内存的使用。当处理大量数据时,使用生成器对象可以避免一次性读取所有数据到内存中,而是逐个读取并处理每个元素,从而节省内存空间。

在这里插入图片描述

<think>我们面对的需求是:在Python字典中存在多个键的情况下,分别对每个键赋予不同的两个列表。 注意:每个键对应的两个列表是不同的,也就是说每个键都有自己专属的两个列表。 根据之前的讨论,我们已经知道如何对一个键赋予两个列表(使用元组列表封装两个列表),并且注意了拷贝问题。 现在,如果每个键对应的两个列表是独立的(即不同键对应的列表内容可能不同),那么我们需要为每个键分别指定两个列表。 有两种典型情况: 情况1:我们已经有了一个键列表keys,以及两个与keys长度相同的列表A列表B,其中A[i]B[i]分别是键keys[i]对应的两个列表。 情况2:我们有一个键列表keys,以及一个二维结构(比如列表列表),其中每个元素是一个包含两个列表元组(或列表)。 下面分别处理: 方法1:使用zip同时迭代键对应的两个列表 假设: keys = [k1, k2, k3, ...] list_of_pairs = [ (listA1, listB1), (listA2, listB2), (listA3, listB3), ... ] 或者: listA = [listA1, listA2, listA3, ...] # 每个元素是一个列表 listB = [listB1, listB2, listB3, ...] 我们可以用字典推导式: 情况1:使用两个列表(每个元素都是列表): result_dict = {k: (a.copy(), b.copy()) for k, a, b in zip(keys, listA, listB)} 情况2:使用一个包含元组列表: result_dict = {k: (pair[0].copy(), pair[1].copy()) for k, pair in zip(keys, list_of_pairs)} 但是要注意,如果每个键对应的两个列表是独立创建的(比如在循环中动态生成),那么可以在循环中直接赋值。 方法2:动态构建 如果我们要给每个键赋予两个空列表,然后后续再填充,可以这样做: result_dict = {k: ([], []) for k in keys} 这样每个键对应的两个列表都是独立的空列表。 但是,如果每个键对应的两个列表一开始就有不同的初始值,那么我们需要在创建字典时通过遍历来分别赋值。 下面通过具体示例说明: 示例1:每个键对应的两个列表是已知的,且存储在两个大列表中(listAlistB分别存储每个键对应的第一个列表第二个列表) 假设: keys = ['a', 'b', 'c'] # 每个键对应的第一个列表分别是:[1,2], [3,4], [5,6] listA = [[1,2], [3,4], [5,6]] # 每个键对应的第二个列表分别是:['x','y'], ['p','q'], ['m','n'] listB = [['x','y'], ['p','q'], ['m','n']] 创建字典: d = {} for i, key in enumerate(keys): # 注意:这里使用深拷贝,避免后续修改相互影响 d[key] = (listA[i][:], listB[i][:]) # 切片浅拷贝,如果列表元素是可变对象则需要深拷贝 # 或者使用copy模块的浅拷贝:copy.copy(listA[i]),但如果列表内还有嵌套的可变对象,则需要深拷贝 示例2:如果每个键对应的两个列表是独立生成的(比如通过函数计算得到),那么可以在循环中直接生成。 例如,我们想为每个键生成一个随机数列表一个字符串列表: import random keys = ['a','b','c'] d = {} for key in keys: list1 = [random.randint(1,10) for _ in range(3)] list2 = [chr(random.randint(65,90)) for _ in range(2)] d[key] = (list1, list2) 注意:这里每次循环都会创建新的列表,所以不会出现引用共享问题。 关键点总结: 1. 确保每个键对应的两个列表是独立的(使用拷贝或每次创建列表)。 2. 根据数据来源选择适当的构建方式(zip、循环、字典推导式)。 下面给出一个完整的示例代码: 情况:已知三个键,每个键对应的两个列表已经分别存储在两个大列表中。 """ keys = ['a', 'b', 'c'] listA = [[1, 2], [3, 4, 5], [6]] # 每个键对应的第一个列表 listB = [['x', 'y'], ['p', 'q', 'r'], ['s']] # 每个键对应的第二个列表 # 使用字典推导式浅拷贝(如果列表元素不可变,浅拷贝足够) d = {k: (a[:], b[:]) for k, a, b in zip(keys, listA, listB)} print(d) # 输出:{'a': ([1, 2], ['x', 'y']), 'b': ([3, 4, 5], ['p', 'q', 'r']), 'c': ([6], ['s'])} # 测试独立性问题:修改其中一个列表 d['a'][0].append(3) print(d['a']) # 输出:([1, 2, 3], ['x', 'y']) print(listA[0]) # 输出:[1,2] (未受影响,因为切片拷贝创建了新列表) 如果列表的元素是可变的(比如嵌套列表),并且我们不想让内部嵌套列表共享,则需要深拷贝: import copy d_deep = {k: (copy.deepcopy(a), copy.deepcopy(b)) for k, a, b in zip(keys, listA, listB)} 示例3:动态生成不同的列表 假设我们要为每个键生成两个列表,第一个列表是从1到n的整数列表,第二个列表是n个相同的字符串(n根据键不同而不同) 我们可以这样: d_dynamic = {} for i, key in enumerate(keys, start=1): n = i + 1 # 假设n与索引有关 list1 = list(range(1, n+1)) list2 = ['hello'] * n d_dynamic[key] = (list1, list2) 输出示例:对于keys=['a','b','c'],第一个键'a':n=1,得到([1], ['hello']); 键'b':n=2,得到([1,2], ['hello','hello']); 等等。 根据用户的问题,每个键赋予两个列表,并且这两个列表是不同的。以上方法可以满足需求。 参考之前的引用,我们需要注意嵌套结构的赋值引用问题,特别是当列表是可变对象时[^1][^2]。 最后,生成相关问题。 </think>### Python字典中为多个键分别赋予不同两个列表的方法 在Python中为字典的多个键分别赋予**不同的两个列表**,关键是根据数据来源选择合适的构建方式。以下是三种常用方法: #### 方法1:使用`zip()`同步迭代(推荐) 当键列表对应的两个列表集合已知且长度一致时: ```python keys = ['A', 'B', 'C'] list1_collection = [[1, 2], [3, 4, 5], [6]] # 每个键对应的第一个列表 list2_collection = [['x', 'y'], ['p', 'q'], ['s']] # 每个键对应的第二个列表 result_dict = { k: (lst1.copy(), lst2.copy()) for k, lst1, lst2 in zip(keys, list1_collection, list2_collection) } print(result_dict) # 输出: {'A': ([1, 2], ['x', 'y']), 'B': ([3, 4, 5], ['p', 'q']), 'C': ([6], ['s'])} ``` - **优势**:简洁高效,单次遍历完成 - **注意**:使用`.copy()`避免引用共享问题[^1] - **适用场景**:数据已结构化存储(如CSV读取结果) #### 方法2:动态生成列表列表内容需动态计算时: ```python import random keys = ['X', 'Y', 'Z'] result_dict = {} for key in keys: # 动态生成不同的两个列表(示例) list_a = [random.randint(1,10) for _ in range(3)] list_b = [f"item_{i}" for i in range(2)] result_dict[key] = (list_a, list_b) print(result_dict) # 可能输出: {'X': ([3, 7, 2], ['item_0', 'item_1']), ...} ``` #### 方法3:深度拷贝解决嵌套引用 当列表包含可变对象(如嵌套字典)时: ```python import copy keys = ['student', 'teacher'] complex_list1 = [{'math': 90}, {'physics': 85}] complex_list2 = [['A+', 'B'], ['A', 'A']] result_dict = { keys[0]: copy.deepcopy(complex_list1), keys[1]: copy.deepcopy(complex_list2) } # 修改不影响原始数据 result_dict['student'][0]['math'] = 95 print(complex_list1[0]['math']) # 输出: 90 (未改变) ``` ### 关键注意事项 1. **引用问题**: - 直接赋值会导致引用共享(修改一处影响多处) - 必须使用`.copy()`浅拷贝或`copy.deepcopy()`深拷贝[^1][^2] ```python # 危险示例(引用共享) bad_dict = {k: (lst1, lst2) for k, lst1, lst2 in zip(keys, list1_collection, list2_collection)} ``` 2. **内存优化**: - 对大型数据使用生成器替代列表推导式 ```python # 生成器示例 result_dict = {k: (list(generate_list1()), list(generate_list2())) for k in keys} ``` 3. **数据类型选择**: - 若列表内容不变,使用元组减少内存占用 ```python result_dict[key] = (tuple(lst1), tuple(lst2)) # 不可变对象 ``` ### 应用场景示例 **多传感器数据处理**: ```python sensors = ['temp', 'humidity', 'pressure'] readings = [ [22.1, 22.5, 23.0], # temp读数 [45, 47, 46], # humidity读数 [1013, 1012, 1015] # pressure读数 ] timestamps = [ ['09:00', '09:05', '09:10'], ['09:01', '09:06', '09:11'], ['09:02', '09:07', '09:12'] ] sensor_data = { sen: (rdgs.copy(), ts.copy()) for sen, rdgs, ts in zip(sensors, readings, timestamps) } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值