鱼C论坛

 找回密码
 立即注册
查看: 871|回复: 14

[已解决]删除文档内标点符号

[复制链接]
发表于 2018-8-27 17:50:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题1
d = {'!':4,'wo':6}
str1 = 'wo'
for cod in d:
    if cod == str1:
        del d[cod]
print(d)

问题1:为什么以上代码会报错,报错如下
Traceback (most recent call last):
  File "C:\Users\leoliu\AppData\Local\Programs\Python\Python37\test.py", line 3, in <module>
    for cod in d:
RuntimeError: dictionary changed size during iteration

问题2:我想删除字典内的所有标点符号,例如删除空格,我可以用del d[' '],但逗号句号冒号问号一个一个删除很麻烦,有快速方法吗?
谢谢

最佳答案
2018-8-27 19:26:16
zhiyuzhishan 发表于 2018-8-27 19:05
您好,
我试了一下列表,就可以边遍历边删除
lst=[1,2,3,4]

虽然于数组都是容器,但字典的数据结构不一样,没有顺序可言。
另外,一边遍历一遍删除,要很小心,很多时候会出差错。要么少检查一个元素,要么越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-27 18:00:15 | 显示全部楼层
不能用 del, 应该是 d.pop(cod)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 18:22:03 | 显示全部楼层
问题1:
  1. d = {'!':4,'wo':6}
  2. str1 = 'wo'
  3. for cod in d.items():
  4.     if cod == str1:
  5.         del d[cod]
  6. print(d)
复制代码



问题2:

  1. d = {'!':4,'wo':6}
  2. str1 = 'wo'
  3. for key in list(d): #items() 项, keys() 键, values()值;
  4.     if key == str1:
  5.         d.pop(key)

  6. print(d)
  7. '''
  8.    为什么要加list, 如果遍历字典,然后边删边遍历,字典就不是原来的字典了,肯定会报错。
  9.    list(d)就是把字典d中的键转成列表,然后根据列表去删字典中的项就没问题了。
  10. '''
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 18:50:08 | 显示全部楼层

谢谢,但是问题1 输出的结果还是{'!': 4, 'wo': 6},并没有删除wo
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 18:52:53 | 显示全部楼层

谢谢,您的回答是:为什么要加list, 如果遍历字典,然后边删边遍历,字典就不是原来的字典了,肯定会报错。
   list(d)就是把字典d中的键转成列表,然后根据列表去删字典中的项就没问题了。
我想问:字典边删除边遍历会报错,但是列表不会报错是吗?这是为什么?
             另外其他可遍历的如字符串,边删除边遍历是否会报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 18:54:20 | 显示全部楼层
zhiyuzhishan 发表于 2018-8-27 18:50
谢谢,但是问题1 输出的结果还是{'!': 4, 'wo': 6},并没有删除wo

你问题1是报错,我回答是解决报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 18:56:10 | 显示全部楼层
zhiyuzhishan 发表于 2018-8-27 18:52
谢谢,您的回答是:为什么要加list, 如果遍历字典,然后边删边遍历,字典就不是原来的字典了,肯定会报错 ...

我觉得我说得够清楚了。你自己也该多思考下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 18:59:27 | 显示全部楼层
claws0n 发表于 2018-8-27 18:00
不能用 del, 应该是 d.pop(cod)

谢谢,按照您的方法如下,还是会报错
d = {'!':4,'wo':6}
str1 = 'wo'
for cod in d:
    if cod == str1:
        d.pop(cod)
print(d)
报错和我之前一样,貌似3楼说的对不能边遍历边删除
Traceback (most recent call last):
  File "C:\Users\leoliu\AppData\Local\Programs\Python\Python37\test.py", line 3, in <module>
    for cod in d:
RuntimeError: dictionary changed size during iteration
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 19:05:57 | 显示全部楼层

您好,
我试了一下列表,就可以边遍历边删除
lst=[1,2,3,4]
for i in lst:
    if i ==3:
        lst.remove(i)
print(lst)

输出结果[1,2,4]

字符串也可以边遍历边修改
lst='1234'
for i in lst:
    if i =='3':
        lst += i
print(lst)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 19:06:11 | 显示全部楼层
本帖最后由 claws0n 于 2018-8-27 19:07 编辑
zhiyuzhishan 发表于 2018-8-27 18:59
谢谢,按照您的方法如下,还是会报错
d = {'!':4,'wo':6}
str1 = 'wo'

  1. d = {'!':4,'wo':6}
  2. str1 = 'wo'
  3. for cod in d:
  4.     if cod == str1[:]:    #比较字符串要小心
  5.         d.pop(cod)
  6.         break     # 删除操作之后要跳出来
  7. print(d)
复制代码

其实可以不用那么麻烦,前提是你知道字典内部确实有这个关键字
  1. d = {'!':4,'wo':6}
  2. d.pop('wo')
  3. print(d)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 19:26:16 | 显示全部楼层    本楼为最佳答案   
zhiyuzhishan 发表于 2018-8-27 19:05
您好,
我试了一下列表,就可以边遍历边删除
lst=[1,2,3,4]

虽然于数组都是容器,但字典的数据结构不一样,没有顺序可言。
另外,一边遍历一遍删除,要很小心,很多时候会出差错。要么少检查一个元素,要么越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-27 19:28:03 | 显示全部楼层
  1. if __name__ == '__main__':
  2.     # 使用字典的pop方法,并设置默认值,避免报错
  3.     d = {'!': 4, 'wo': 6, ' ': 1}
  4.     for key in list("!@#$%^&*()_+ "):  # 要删除的标点符号列表
  5.         d.pop(key, None)
  6.     print(d)

  7.     # 字典推导式
  8.     d = {'!': 4, 'wo': 6, ' ': 1}
  9.     d = {key: value for key, value in d.items() if key not in list("!@#$%^&*()_+ ")}
  10.     print(d)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 19:38:58 | 显示全部楼层

思路不一样,点醒我了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 19:39:40 | 显示全部楼层
claws0n 发表于 2018-8-27 19:26
虽然于数组都是容器,但字典的数据结构不一样,没有顺序可言。
另外,一边遍历一遍删除,要很小心,很多 ...

谢谢,明白一些了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-27 19:47:58 | 显示全部楼层
ba21 发表于 2018-8-27 18:56
我觉得我说得够清楚了。你自己也该多思考下。

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表