首页 > 解决方案 > 加载 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"} ] }

标签: pythonpython-3.xdiscord.py

解决方案


您可以创建一个小写名称的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

推荐阅读