python - 加载 Json 文件不区分大小写
问题描述
我试图使下面的代码不区分大小写,但它不起作用。
如果我尝试加载确切的名称,!ping george
它的工作原理,但如果我尝试混合上层或下层!ping George
机器人不回复。
@bot.command(pass_context=True)
async def ping(ctx, namesList):
with open('data.json') as json_file:
d = json.load(json_file)
for p in d['people']:
if(p['Name'] in (namesList)):
await bot.send_message(ctx.message.channel, p)
我把它改成if(p['Name'] in (list)):
了 if(p['Name'].lower() in (list)):
仍然无法正常工作,我认为我在这条线上做错了。
从评论编辑:
namesList # from json file names contains with upper lower mixed.
some names contain numbers, and some names have space between name and sir name.
data.json sample
{"people": [
{"UserID": "xxxxx123", "Name": "Steve", "Sex": "Male", "age": "30"},
{"UserID": "xxxxx124", "Name": "Rachel", "Sex": "Female", "age": "25"},
{"UserID": "xxxxx125", "Name": "George", "Sex": "Male", "age": "22"} ] }
解决方案
您可以创建一个小写名称的set()p["Name"]
并在其中查找您的名称:
@bot.command(pass_context=True)
async def ping(ctx, namesList):
# sets are better for lookups. prepare a set with all lower case names
setOfNamesLowerCase = set ( x.lower() for x in namesList ) # dont name lists list
with open('data.json') as json_file:
d = json.load(json_file)
for p in d['people']:
if(p['Name'].lower() in setOfNamesLowerCase ):
await bot.send_message(ctx.message.channel, p)
集合更适合这个任务,查找是 O(1),如果你有重复,它们会自动减少。
给定正确的输入,逻辑简化以检查它是否应该工作:
def find_tata(namesList):
# sets are better for lookups. prepare a set with all lower case names
setOfNamesLowerCase = set ( x.lower() for x in namesList ) # dont name lists list
if "tata" in setOfNamesLowerCase:
print("Its in")
else:
print ("Its not")
find_tata( ["not in here","not in"])
find_tata( ["not in here","tata"])
输出:
Its not
Its in
编辑2:
import json
js = """{"people": [
{"UserID": "xxxxx123", "Name": "Steve", "Sex": "Male", "age": "30"},
{"UserID": "xxxxx124", "Name": "Rachel", "Sex": "Female", "age": "25"},
{"UserID": "xxxxx125", "Name": "George", "Sex": "Male", "age": "22"} ] }"""
def ping(namesList):
# sets are better for lookups. prepare a set with all lower case names
setOfNamesLowerCase = set ( x.lower() for x in namesList ) # dont name lists list
d = json.loads(js)
for p in d['people']:
if(p['Name'].lower() in setOfNamesLowerCase ):
print("Doing smth for ", p["Name"])
ping(["rachEl", "ludwig", "ernie", "GEoRgE"])
输出:
Doing smth for Rachel
Doing smth for George
推荐阅读
- typescript - 如何在 TypeScript 中获取对象中所有键值对的联合类型?
- mysql - Debian 10 看到连接到端口 3306 的 IP
- javascript - javascript中的API正在返回数据,但没有保存到数组中
- spring - 我如何使弹簧数据投影将作为关系的集合作为参数?
- python - 如何从元组列表中计算元组列表?
- jenkins - Thread.sleep() 在 Jenkins Quiet Down 模式下不起作用
- java - Spring Boot - 支持多个 issuer-uri
- python - Python多线程同步
- hazelcast - 确定 Hazelcast 节点是否拥有地图条目
- java - 浏览器刷新不起作用,spring boot + React