Python中列表元素与字典键匹配失败问题求助
问题分析与解决
这个问题我太熟了!核心原因就是**readline()会保留每行末尾的换行符\n**,导致你看起来完全相同的字符串,实际一个带换行、一个不带,自然匹配失败啦。
具体问题拆解
咱们一步步看代码里的坑:
字典构建时的隐藏问题
当你用sys.stdin.readline()读取键值对行时,比如输入Bob 456然后回车,str1实际是"Bob 456\n"(末尾带着看不见的换行符)。
你用split(" ")分割的话,虽然key能拿到"Bob"(不带换行),但value会变成"456\n"(带换行)——这部分暂时不影响键匹配,但后续用value的时候也会出问题。而且split(" ")只能按单个空格分割,如果输入时不小心多打了空格,还会分割出空字符串,导致程序报错。查询时的匹配失败根源
读取查询内容时,check = sys.stdin.readline()会把用户输入的每一行(包括末尾的\n)完整存下来。比如你输入Bob然后回车,check就是"Bob\n",而字典里的key是"Bob",这时候"Bob\n" == "Bob"显然是False,所以匹配永远失败。
修复后的代码
我帮你调整了代码,解决了换行符问题,同时优化了效率:
#!/bin/python3 import sys n = int(sys.stdin.readline()) dicti = {} # 构建字典:去掉换行+用通用split分割 for i in range(n): str1 = sys.stdin.readline().rstrip('\n') # 只去掉末尾换行,保留键值本身的空格(如果有的话) key, value = str1.split() # 不带参数的split会自动分割任意空白(空格、制表符等),更鲁棒 dicti[key] = value string1 = [] # 读取查询内容:处理换行+EOF情况 while True: check = sys.stdin.readline() if not check: # 处理输入结束(比如用户按Ctrl+D/Z) break check = check.rstrip('\n') # 去掉换行符 if check: # 跳过空行 string1.append(check) # 匹配输出:用字典的in操作,比遍历高效N倍 for i in string1: if i in dicti: sys.stdout.write(f"{i}\n") # 加上换行符,让输出更规范
额外优化点
- 原代码里遍历字典所有键来匹配,效率极低(尤其是字典很大的时候),直接用
i in dicti判断键是否存在,字典的查找是O(1)的,比遍历O(n)快太多。 - 用
rstrip('\n')而不是strip(),可以保留键或查询内容首尾的空格(如果你的业务需要的话),如果不需要首尾空格,直接用strip()更省心。
内容的提问来源于stack exchange,提问作者PraveenMathew
相关产品推荐
相关产品推荐

