3 列表循环-字典循环-删除-文件操作

Python循环与文件操作技巧
部署运行你感兴趣的模型镜像

1 列表循环

for item in lst:  如果你只需要拿到元素
for i in range(len(lst)):  不光需要拿到元素, 还需要拿到索引

in lst

lst = ["小姨多鹤_sb", "linux核心编程_sb", "shell脚本大全_sb", "linux私房菜_sb"]
for item in lst:
    item = item.replace("_sb", "")
    print(item)

结果
小姨多鹤
linux核心编程
shell脚本大全
linux私房菜

in range

lst = ["小姨多鹤_sb", "linux核心编程_sb", "shell脚本大全_sb", "linux私房菜_sb"]

for item in lst:
    print(item)

for i in range(len(lst)):
    item = lst[i]
    item = item.replace("_sb", "")
    lst[i] = item
print(lst)

结果
小姨多鹤_sb
linux核心编程_sb
shell脚本大全_sb
linux私房菜_sb
['小姨多鹤', 'linux核心编程', 'shell脚本大全', 'linux私房菜']

2 字典循环

for k in dic: 循环直接拿到每一个key
for k, v in dic.items(): 循环字典直接拿到key和value
第一种 in dic
dic = {"赵本山": "劝说小丑", "范伟": "道士下山", "郭德纲": "祖宗十九代"}

for item in dic:
    print(item, dic[item])

结果
赵本山 劝说小丑
范伟 道士下山
郭德纲 祖宗十九代
第二种,in dic.items() 可以直接拿到k, v
dic = {"赵本山": "劝说小丑", "范伟": "道士下山", "郭德纲": "祖宗十九代"}
for k, v in dic.items():  # (key, value)
    print(k, v)

结果
赵本山 劝说小丑
范伟 道士下山
郭德纲 祖宗十九代

自动解包

a, b = (1, 2)  # 元祖自动解包, 解构
print(a)
print(b)

结果
1
2

3 列表和字典的删除-有大坑

列表的删除,把需要删除的元素找到,然后存到新列表,循环新列表,从老列表中删除。

原因:删除索引0后,1(张无忌)会移动到0位置,后面依次类推,张大郎移到1,第二次循环时会删除张大朗,而张无忌没有删除。

lst = ["张本山", "张无忌", "张大郎", "张alex", "小妞"]
new_lst = []
for item in lst:
    if item.startswith("张"):
        # lst.remove(item) # 删除,删除索引0后,1(张无忌)会移动到0位置,后面依次类推,张大郎                         
        new_lst.append(item) # 把要删除的内容记录在一个新列表中
for item in new_lst:  # 循环新列表, 删除老列表
    lst.remove(item)
print(lst)

结果
['小妞']

字典的删除

dic = {"赵本山": "劝说小丑", "范伟": "道士下山", "郭德纲": "祖宗十九代"}
lst = []
for k in dic:
    print("取出key", k)
    lst.append(k)
print("存到新列表",lst)
print("分割线")
for item in lst:
    print("删除key",item)
    dic.pop(item)

print(dic)

结果
取出key 赵本山
取出key 范伟
取出key 郭德纲
存到新列表 ['赵本山', '范伟', '郭德纲']
分割线
删除key 赵本山
删除key 范伟
删除key 郭德纲
{}

案列统计车牌数量

思路

# 1. 拿到每一个车牌子
# 2. 拿到车牌的简称
# 3. 通过简称去拿省份名称
# 4. 统计车牌的数量????
cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '沪B25041', '黑C34567']
locations = {'沪': '上海', '京': '北京', '黑': '黑龙江', '鲁': '山东', '鄂': '湖北', '湘': '湖南'}

result = {}
for car in cars:  # 鲁A32444
    loc = car[0]  # 鲁
    prov = locations[loc]  # 山东
    # 分成两种情况
    # 如果字典中有这个省份. 只需要value+1即可
    if result.get(prov):  # 去字典中查找这个省份信息. 如果找到了. 返回的是数字, 如果找不到返回的是None
        result[prov] += 1
    else:  # 如果字典中没有这个省份. 需要新增一个省份:1
        result[prov] = 1

print(result)

结果
{'山东': 2, '北京': 1, '黑龙江': 3, '上海': 1}

4  编码

ascii : 英文大小写字母, 数字, 标点符号(英文), 计算机操作符
    一个ascii由8bit01 组成. 256个文字 只用到了前7位. 字节. 1个byte表示8个01
gbk : 国标码(guo biao kuo) 16个01组成    2byte,  最多能表示65536个文字.
    中文, 日文, 韩文, 蒙古文, 藏文. 繁体中文. 兼容ascii
unicode: 万国码, 由32个bit组成, 4byte
    不能进行存储和传输
    ucs-2 拿出uncode的一个面进行使用(python默认用的是它)
    ucs-4 由32个bit组成
utf-8 : unicode的实现, 可变长度的unicode
    英文:  8bit  1byte
    欧洲: 16bit  2byte
    其他: 24bit  3byte
utf-8和gbk不能直接转换
编码:  encode()
解码:  decode()

5 文件操作

open(文件路径, mode="模式", encoding="编码规则")
for line in f:
    读取文件中的每一行数据
f.read()
f.write()
模式:
    r 只读
    w 只写
    a 只能追加写
    + 扩展
    r+ 读写操作
    w+ 写读操作
    a+ 追加写读操作
    b bytes 读取和写入非文本文件
    .exe  .zip .rar .jpg

r读文件

f = open("E:/资料/test.txt", mode="r", encoding="utf-8")
print(f.read())  # 文件的内容全部读取出来,如果文件大容易导致内存溢出问题
# print(f.read(3)) # 读3行

# 推荐
for line in f: # 把文件中的每一行读取出来
    print(line.strip())
f.close()

把print输出换行的\n替换为空

print("娃哈哈", end="")
print("矿泉水", end="")
结果
娃哈哈矿泉水

w写文件,每次执行open时,会清空原文件

# 写: 能创建文件, w模式会自动的清空源文件
f = open("呵呵呵.txt", mode="w", encoding="utf-8")
f.write("你好\n")
f.write("我也好")
f.close()
a写文件,追加
# a: append追加. 在原来文件的基础上写入内容
f = open("哈哈哈.txt", mode="a", encoding="utf-8")
f.write("你好111")
f.close()
r+读写模式
f = open("哈哈哈.txt", mode="r+", encoding="utf-8")
print(f.read())
f.write("我很好")
f.close()

文件复制:不要有编码,边复制边写

f = open()  

f.close()

等同于

with open() as f
with open("c:/崔万志-不抱怨-靠自己.flv", mode="rb") as f1, open("d:/崔万志-不抱怨-靠自己.flv", mode="wb") as f2:
    for part in f1:
        f2.write(part)

文件剪切

import os # 导入os模块
with open("c:/崔万志-不抱怨-靠自己.flv", mode="rb") as f1, open("d:/崔万志-不抱怨-靠自己.flv", mode="wb") as f2:
    for part in f1:
        f2.write(part)
os.remove("d:/崔万志-不抱怨-靠自己.flv")

 

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们有一个包含字典列表,需要遍历这个列表,并对每个字典进行操作。根据引用[4]中的示例,我们可以使用嵌套循环:外层循环遍历列表中的每个字典,内层循环遍历每个字典的键值对。另外,引用[2]提到遍历列表时如果需要索引可以使用enumerate,但这里我们不需要索引,所以直接遍历即可。引用[4]还提到,遍历字典可以使用.items()方法来同时获取键和值。步骤:1.遍历列表:使用for循环,每次取出一个字典。2.遍历字典:对每个字典,使用for循环和.items()方法遍历其键值对。示例代码:假设我们有如下列表: people=[{"name": "Alice","age":25},{"name":"Bob", "age":30},{"name": "Charlie","age":35}]遍历并打印每个字典的所有键值对。</think>### Python 循环遍历包含字典列表详解 在 Python 中遍历包含字典列表时,核心是**嵌套循环结构**的应用。以下是具体方法和示例: #### 一、基础遍历方法 1. **直接遍历字典键值对** 使用双层循环:外层遍历列表元素(字典),内层遍历字典键值对 ```python data = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}, {"name": "Charlie", "age": 35} ] for person in data: # 遍历列表中的每个字典 for key, value in person.items(): # 遍历字典的键值对 print(f"{key}: {value}") print("-----") # 分隔线[^4] ``` 输出: ``` name: Alice age: 25 ----- name: Bob age: 30 ----- name: Charlie age: 35 ----- ``` 2. **按需访问特定键值** 直接定位字典中的特定键: ```python for person in data: print(f"{person[&#39;name&#39;]} is {person[&#39;age&#39;]} years old")[^2] ``` 输出: ``` Alice is 25 years old Bob is 30 years old Charlie is 35 years old ``` #### 二、高级遍历技巧 1. **带索引遍历** 使用 `enumerate` 获取元素位置: ```python for index, person in enumerate(data): print(f"Record {index+1}: {person[&#39;name&#39;]}") # 可在此处添加字典操作[^2] ``` 2. **条件过滤遍历** 结合列表推导式筛选数据: ```python # 找出年龄大于30的人 seniors = [p for p in data if p[&#39;age&#39;] > 30] for person in seniors: print(person[&#39;name&#39;])[^4] ``` 3. **多级嵌套字典处理** 处理字典中嵌套字典的情况: ```python complex_data = [ {"id": 1, "details": {"color": "red", "size": "L"}}, {"id": 2, "details": {"color": "blue", "size": "M"}} ] for item in complex_data: print(f"ID: {item[&#39;id&#39;]}") for detail_key, detail_val in item[&#39;details&#39;].items(): print(f" {detail_key}: {detail_val}")[^1] ``` #### 三、关键注意事项 1. **避免遍历时修改字典** 直接遍历字典时修改会导致 `RuntimeError`: ```python # 错误示范 for person in data: person.pop(&#39;age&#39;) # 可能引发RuntimeError[^1] # 正确做法:创建副本 for person in data.copy(): person.pop(&#39;age&#39;, None) # 安全删除[^4] ``` 2. **处理键不存在的情况** 使用 `get()` 方法避免 `KeyError`: ```python for person in data: email = person.get(&#39;email&#39;, &#39;N/A&#39;) # 默认值 print(email)[^2] ``` 3. **性能优化** 大数据量时使用生成器表达式: ```python # 生成器节省内存 names = (person[&#39;name&#39;] for person in data) for name in names: process(name) # 逐条处理 ``` #### 四、完整应用示例 ```python # 模拟从文件读取数据(参考引用[3]) import json with open(&#39;data.json&#39;) as f: data = json.load(f) # 假设文件内容是字典列表 # 处理并输出 print("员工报告".center(30, &#39;=&#39;)) for i, employee in enumerate(data, 1): print(f"\n员工 #{i}:") for key, val in employee.items(): print(f" {key.capitalize()}: {val}") # 计算奖金(示例操作) bonus = employee.get(&#39;salary&#39;, 0) * 0.1 print(f" 奖金: ${bonus:.2f}")[^3] ``` > **遍历策略选择指南**: > - 简单输出 → 直接键值遍历 > - 数据处理 → 条件过滤+特定键访问 > - 大数据 → 生成器表达式 > - 复杂结构 → 递归或多层循环 ```mermaid graph TD A[遍历字典列表] --> B{需求类型} B -->|简单查看| C[直接遍历键值对] B -->|提取特定数据| D[定向访问键] B -->|大数据处理| E[生成器表达式] B -->|复杂结构| F[递归遍历] C --> G[使用 items() 方法] D --> H[使用 get() 安全访问] E --> I[() 替代 []] F --> J[检测值类型递归] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值