1 with open('X:/XXX/XXX/XXX/data.txt',encoding = "utf-8-sig") as file:
2 #上一行的参数!只使用'r'会出现报错:'gbk' codec can't decode byte 0xb7 in position 8: illegal multibyte sequence,输入encoding='utf-8'可解决
3 #只使用"utf-8"输出时会出现文件第一行多出十六进制编码,用'-sig'解决。
4 data_line = file.readline()
5 data_line = data_line.replace('\t',',')
6 data_line = data_line.strip('\n')
7 keys = data_line.split(',')
8
9
10 values_wet = set() #set()是创建空集合的唯一方法
11 values_dry = set()
12 values_harm = set()
13 values_re = set()
14
15
16 while True:
17 data_line = file.readline()
18 if data_line != '': #解决最后一行问题,注意要加else: break,不然死循环
19 data_line = data_line.strip('\n')
20 data_line = data_line.replace('\t',',')
21 values = data_line.split(',')
22 values_wet.add(values[1]) #添加值到集合,".add()"方法
23 values_dry.add(values[2])
24 values_harm.add(values[3])
25 values_re.add(values[4])
26 else:
27 break
28
29
30 dic = {keys[1]:values_wet, keys[2]:values_dry, keys[3]:values_harm, keys[4]:values_re}
31
32
33 #定义函数判断values属于哪个key
34 def get_key(value,dict=dic):
35 return [k for k,v in dict.items() if value in v] #列表解析式
36
37
38 #输出
39 value1 = input('Enter the thing:')
40 print(get_key(value1))
- 效果是输入一种垃圾就可以得到它应该被放进哪种垃圾桶:
======== RESTART: E:\xxxx\xxxx\xxxx\xxx.py ========
Enter the thing:创口贴
['有害垃圾']
>>>
- 思路是建立了一个大字典,字典下有四个key,每个key对应的value都是一个集合,集合里为各种垃圾的值。日后想要添加新的垃圾就只要往集合里.add()即可。
- get_key函数的主体是从网上找的,最后针对自己的需求对函数内容稍作修改。笔者对列表解析式的使用实在生疏,需多加练习。
- 最后附上data.txt
序号 湿垃圾 干垃圾 有害垃圾 可回收物
1 菜叶 旧浴缸 油漆桶 塑料瓶
2 橙皮 盆子 镍镉电池 食品罐头
3 葱 坏马桶 打火机 玻璃瓶
4 饼干 旧水槽 创口贴 易拉罐
5 番茄酱 贝壳 酒精 报纸
6 蛋壳 化妆刷 调色板 旧书包
7 西瓜皮 坛子 油漆 旧手提包
8 马铃薯 海绵 过期的胶囊药物 旧鞋子
9 鱼骨 花生壳 温度计 牛奶盒
10 甘蔗 菜板 过期药片 旧塑料篮子
11 玉米 砖块 荧光灯 旧玩偶
12 骨头(鸡鸭鹅) 卫生纸 蓄电池 玻璃壶
13 虾壳 篮球 医用棉签 旧铁锅
14 蛋糕 桃核 煤气罐 垃圾捅
15 面包 杯子 医用手套 旧镜子
16 草莓 陶瓷碗 杀虫剂 牙刷
17 西红柿 一次性筷子 水彩笔 塑料梳子
18 梨 瓦片 农药瓶 旧帽子
19 蟹壳 西梅核 医用纱布 旧夹子
20 香蕉皮 坏的花盆 口服液瓶 废锁头
21 辣椒 扫把 香水瓶 牙膏皮
22 巧克力 木质梳子 荧光棒 雨伞骨架
23 茄子 脏污衣服 过期化妆品 旧纸袋
24 豌豆皮 烟蒂 发胶 纸盒
25 苹果 渣土 注射器 旧玩具
26 树叶 湿垃圾袋 废弃灯泡 NULL