zoukankan      html  css  js  c++  java
  • 有质量的两道面试题

    话在前:不足之前,请多多指教

    一、多层字典解析问题

    原题目

    {
      "Count":5,
      "Items":
      [
        {
              "name":{"string":"a"},
            "email":{"string":"abc@163.com"},
            "friends":
              [
                {
                  "friend1": {
                    "name": {
                      "string": "name1"
                    },
                    "sex": {
                      "int": 1
                    },
                    "addr": {
                      "string": "addr1"
                    }
                  }
                }
              ],
            "moreinfo":{
                "Desc1":{"string":"aaaa"},
                "Desc2":{"int":22},
                "Desc3":{"list":["ddddd","11111"]}
            }
        }
      ]
    }

    将上面的json文件,转化为python内容,并且去掉不需要的数据例如(包含对应的数据类型如:string,int,list)之后变为

    {
      "Count":5,
      "Items":
      [
        {
              "name":"a",
            "email":"abc@163.com",
            "friends":
              [
                {
                  "friend1": {
                    "name": "name1"
                    "sex":  1
                    "addr":  "addr1"
                  }
                }
              ],
            "moreinfo":{
                "Desc1":"aaaa",
                "Desc2":22,
                "Desc3":"ddddd","11111"}
            }
        }
      ]
    }

    解题思路:使用递归解决多层字典的节点问题,子节点有列表和字典两种表现形式,所以这两种形式都是递归,

    解题代码

    import json
    
    # 修改的函数
    def modify(dic):
        # 确保传进来的是一个字典,这里我并没有使用try-except做容错,只是简单的为了需求的实现
        if isinstance(dic,dict):
            # 变量字典的key和value
            for key,val in dic.items():
                # 这里多层字典嵌套的话,子层主要是字典或者列表的方式,方式这里主要针对子层是字典和列表两种方式处理
                if isinstance(val,dict):
                    # 如果val是一个字典,并且长度为1,说明是最内层的字典了,是需要做处理的地方了
                    if len(val) == 1:
                        # 将内层字典的val赋值给上一层的key,即项目的需求
                        dic[key]=list(val.values())[0]
                    # 如果不是最内层,继续递归
                    modify(val)
                # 内层数据是列表的情况
                elif isinstance(val,list):
                    if len(val)>0:
                        for _dic in val:
                            # 列表里面是字典继续递归
                            modify(_dic)
                          
    if __name__ == '__main__':
    
        with open('./test_json.json', 'r') as fp:
            json_str = fp.read()
    
        json_dic = json.loads(json_str)
        print('修改前打印*********************')
        print(json_dic)
        modify(json_dic)
        print('修改后打印*********************')
        print(json_dic)

    打印结果

    修改前打印*********************
    {'Count': 5, 'Items': [{'name': {'string': 'a'}, 'email': {'string': 'abc@163.com'}, 'friends': [{'friend1': {'name': {'string': 'name1'}, 'sex': {'int': 1}, 'addr': {'string': 'addr1'}}}], 'moreinfo': {'Desc1': {'string': 'aaaa'}, 'Desc2': {'int': 22}, 'Desc3': {'list': ['ddddd', '11111']}}}]}
    修改后打印*********************
    {'Count': 5, 'Items': [{'name': 'a', 'email': 'abc@163.com', 'friends': [{'friend1': {'name': 'name1', 'sex': 1, 'addr': 'addr1'}}], 'moreinfo': {'Desc1': 'aaaa', 'Desc2': 22, 'Desc3': ['ddddd', '11111']}}]}

    二、mongodb的基本使用

    原题目:

    Mongodb 查询:
    Db.msg.find()
    { "_id" : ObjectId("5f96ef6c1fb5b9e52cd23179"), "msgId" : 1696261644, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "ufne", "newMsgId" : NumberLong("4690548300089373689"), "createTime" : 1603727095 }
    { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317a"), "msgId" : 1696261645, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 10002, "content" : "<sysmsg type="ClientCheckConsistency"</ClientCheckConsistency></sysmsg>", "newMsgId" : NumberLong("4429536039473582128"), "createTime" : 1603727095 }
    { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317b"), "msgId" : 1696261647, "fromUserName" : "user1", "toUserName" : "user2", "msgType" : 1, "content" : "Hello", "newMsgId" : NumberLong("1453640785042681328"), "createTime" : 1603727109 }
    { "_id" : ObjectId("5f96ef6c1fb5b9e52cd2317c"), "msgId" : 1696261648, "fromUserName" : "user2", "toUserName" : "user1", "msgType" : 1, "content" : "gggg", "newMsgId" : NumberLong("4776642146216801785"), "createTime" : 1603727130 }
    ….
    
    以user1,user2为例,需要获取 user1, user2 相互聊天信息中最后一条聊天的信息。
    构造一个方法,获取查询记录中,指定用户的最后一条聊天记录。
    Def get_last_msg(user:str) -> msg_dict:dict:
    
    另外针对获取最后一条信息的场景,提出解决方案。

    数据在mongodb中显示为

     代码为

    import pymongo
    # 链接mongodb
    pymongo_client = pymongo.MongoClient('mongodb://root:123456@127.0.0.1:27017')
    # 链接数据库
    pymongo_db = pymongo_client['test_db']
    # 链接表
    pymongo_table = pymongo_db.test_table
    
    
    
    def get_last_msg(user):
        # 管道条件
        pipeline = [
            # 根据传递过来的用户进行搜索
            {'$match':{'fromUserName':user}},
            # 因为要最后一条,所以倒叙更方便
            {'$sort': {'createTime': -1,}},
            # 倒叙后取出第一条
            {'$limit':1}
            
        ]
        # 插叙
        ret = pymongo_table.aggregate(pipeline)
        ret1 = [u for u in ret]
        # 返回结果
        return ret1[0]
    
    msg = get_last_msg('user2')
    # 打印验证
    print(msg)

    打印结果

    {'_id': ObjectId('5fce176c3dcc6560be446156'), 'msgId': 1696261648.0, 'fromUserName': 'user2', 'toUserName': 'user1', 'msgType': 1.0, 'content': 'gggg', 'newMsgId': '"4776642146216801785"', 'createTime': 1603727130}
    

      补充:另外针对获取最后一条信息的场景,提出解决方案,不是很理解,往有知道的朋友可以指点一二,感谢!

  • 相关阅读:
    初识计算机
    前端html css
    mysql高级
    mysql多表查询
    mysql数据库查询
    mysql表关系
    mysql数据类型
    mysql数据库介绍
    异步回调 协程
    GIL-全局解释器锁
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/14099406.html
Copyright © 2011-2022 走看看