有质量的两道面试题

2020-12-09 10:34:55 浏览数 (1)

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

一、多层字典解析问题

原题目

代码语言:javascript复制
{
  "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)之后变为

代码语言:javascript复制
{
  "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"}
        }
    }
  ]
}

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

解题代码

代码语言:javascript复制
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)

打印结果

代码语言:javascript复制
修改前打印*********************
{'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的基本使用

原题目:

代码语言:javascript复制
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中显示为

代码为

代码语言:javascript复制
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)

打印结果

代码语言:javascript复制
{'_id': ObjectId('5fce176c3dcc6560be446156'), 'msgId': 1696261648.0, 'fromUserName': 'user2', 'toUserName': 'user1', 'msgType': 1.0, 'content': 'gggg', 'newMsgId': '"4776642146216801785"', 'createTime': 1603727130}

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

0 人点赞