美文网首页Python
Python—字典黑魔法

Python—字典黑魔法

作者: 八戒无戒 | 来源:发表于2019-08-20 01:39 被阅读0次

    python中三大数据结构,列表、字典、集合,字典是平时处理数据所用到的做多的,以此记录几个字典使用时黑魔法(骚操作)。

    有一个原始序列数据:

    info = {
         "info1":
             {"name": "Limin", "age": 20, "height": 176, "score": 90},
         "info2":
             {"name": "jenny", "age": 14, "height": 140, "score": 98},
         "info3":
             {"name": "tonya", "age": 26, "height": 180, "score": 82},
         "info4":
             {"name": "suyoo", "age": 22, "height": 165, "score": 89},
         }
    

    1. 字典排序
    现在需要将 info按照身高进行排序,并输出到一个列表里。当然是选择so strong
    sorted()函数了

    In [2]: info                                                                                                                                                                                                     
    Out[2]: 
    {'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
     'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}
    
    In [3]: sorted(info.items(), key=lambda x: x[1]['height'])                                                                                                                                                       
    Out[3]: 
    [('info2', {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}),
     ('info4', {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}),
     ('info1', {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90}),
     ('info3', {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82})]
    
    

    现在需要是需要升高由大到小呢

    In [4]: sorted(info.items(), key=lambda x: x[1]['height'], reverse=True)                                                                                                                                         
    Out[4]: 
    [('info3', {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}),
     ('info1', {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90}),
     ('info4', {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}),
     ('info2', {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98})]
    
    

    如果不想要infox字样了呢,so easy

    In [5]: sorted(info.values(),key=lambda x:x['height'])                                                                                                                                                           
    Out[5]: 
    [{'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89},
     {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}]
    
    

    so,可以看到字典暗黑魔法之一的 sorted() 是不是very强大,不过此处需要注意的是info字典本身并没有发生变化,变化的仅是返回值

    2. 字典数据筛选(字典推导式)
    现在需要筛选出info中成绩大于等于90的学生信息,这时候就该写一个函数了。

    result={}
    for key,value in info.items():
        for i,k in value.items():
            if i == "score" and k >= 90:
                result[key]=value
    print(result)  
                                                                                                                                                                                                
    >>>
    {'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}}
    
    

    是不是看似很完美,but,python中有一个叫推导式(划重点)的东西,为何不用呢

    In [9]: info                                                                                                                                                                                                     
    Out[9]: 
    {'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
     'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}
    
    In [10]: {key:value for key,value in info.items() if value["score"] >= 90}                                                                                                                                       
    Out[10]: 
    {'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98}}
    
    

    结果一模一样有木有,仅仅一行代码,很强大的推导式。

    3. 字典的计算
    现在需要取出info中成绩最好和最坏的两名学生,当然不是用目测法。假如1000条数据,我相信目测法还是可以试试的。
    还是先用万能的函数吧。

    # 函数
    result={}
    score= [x["score"] for x in info.values()]
    for key,value in info.items():
        for i,k in value.items():
            if i == "score" and k in [max(score), min(score)]:
                result[key]=value
    print(result)
    >>>
    {'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}}
    
    # 列表推导式法
    score= [x["score"] for x in info.values()]
    print({k:v for k,v in info.items() if v["score"] in [max(score), min(score)]})
    >>>
    {'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82}}
    

    4. 字典的键值翻转(一道经典面试题)
    就是将上面info字典中的值(也就是第二层字典)中的键值对调,假如不存在重复键的情况。

    # 函数解法
    result = {}
    for key, value in info.items():
        result1 = {}
        for i,v in value.items():
            result1[i]=v
        result[key] = result1
    print(result)
    
    >>>
    {'info1': {176: 'height', 20: 'age', 90: 'score', 'Limin': 'name'},
     'info2': {14: 'age', 140: 'height', 98: 'score', 'jenny': 'name'},
     'info3': {180: 'height', 26: 'age', 82: 'score', 'tonya': 'name'},
     'info4': {165: 'height', 22: 'age', 89: 'score', 'suyoo': 'name'}}
    

    再来看看推倒式解法,一句话,有木有很强大

    In [28]: info                                                                                                                                                                                                    
    Out[28]: 
    {'info1': {'age': 20, 'height': 176, 'name': 'Limin', 'score': 90},
     'info2': {'age': 14, 'height': 140, 'name': 'jenny', 'score': 98},
     'info3': {'age': 26, 'height': 180, 'name': 'tonya', 'score': 82},
     'info4': {'age': 22, 'height': 165, 'name': 'suyoo', 'score': 89}}
    In [29]: {k:{i:v for v,i in info[k].items()} for k in info}                                                                                                                                                      
    Out[29]: 
    {'info1': {176: 'height', 20: 'age', 90: 'score', 'Limin': 'name'},
     'info2': {14: 'age', 140: 'height', 98: 'score', 'jenny': 'name'},
     'info3': {180: 'height', 26: 'age', 82: 'score', 'tonya': 'name'},
     'info4': {165: 'height', 22: 'age', 89: 'score', 'suyoo': 'name'}}
    
    

    相关文章

      网友评论

        本文标题:Python—字典黑魔法

        本文链接:https://www.haomeiwen.com/subject/iciysctx.html