Python字典嵌套字典排序,该怎么处理?

Python014

Python字典嵌套字典排序,该怎么处理?,第1张

感觉这个需求有些许问题,因为通常对比排序的都是同一类型的数据,譬如aaa代表是年龄,bbb代表的是工资,等等... 所以不会拿自己的年龄和工资作一次排序。

#  要做的话,可以手动给它并成一个新列‘sort_key’。 obj就是你最外层的a,免得同名混淆

for i in obj:

obj[i]['sort_key'] = obj[i].values()[0]

#  目的是构造出这样的结构:

#  ('c', {'sort_key': 1, 'ccc': 1}), ('d', {'sort_key': 2, 'ddd': 2}), .....)

print(sorted(obj.items(), key = lambda x:x[1]['sort_key']))

实际上各种推导式的本质就是for循环, 它们之间的区别只是取值方式的不同和表达式的不同

首先, 字典的取值方式有两种: 按key取值, 使用get方法取值

其次, 字典推导式的表达式部分需要写成 key:value 的形式

如果要使用字典推导式推导一个嵌套字典

例如:

infos = {"张三":{ "age":18, "salary":5000},

"李四":{"age":19, "salary":8000},

"王五":{ "age":20, "salary":6000}}

要从infos这个嵌套的字典中推导出一个形如{"张三":5000, "李四":8000, "王五":6000}的字典

首先可以考虑最内层的推导式:

names = [name for name in infos]

这样就得到了一个姓名的列表: ["张三", "李四", "王五"]

再迭代这个列表, 生成字典的每一项, 于是字典生成式应该像下面这样:

salary_dict = {name:薪资 for name in names}

在这里, 因为name正好是infos这个字典的key, 所以可以使用name从字典infos中取出对应的薪资, 于是有下面的形式:

salary_dict = {name:infos[name]["salary"] for name in names}

这里就用到的字典的用key取值的方式, 当然, 也可以用get方法取值, 例如下面的形式:

salary_dict = {name:infos.get(name).get("salary") for name in names}

这两种方式都是可以的, 根据个人喜好选择就好

为了显得逼格更高, 可以把names的列表推导式和salary_dict的字典推导式结合起来, 于是就得到下面的形式:

salary_dict = {name:infos[name]["salary"] for name in (name for name in infos)}

到这里, 你会发现表达式里有好多name, 显得非常重复, 实际上这里并不需要列表推导式, 直接从字典里迭代出来的key就是name了, 所以最终的形式如下:

salary_dict = {name:infos[name]["salary"] for name in infos}

这里为了得到一个比较简单的结果而绕了一个大圈子, 是为了说明更加通用方法, 对于这个例子, 很容易就能得出结果的哈

1、字典:

      两大特点:无序,键唯一

      无序存储,键值对的形式存储数据

  键是唯一不可修改的,不能用列表做键

2、python中不可变类型:整形,字符串,元组

    可变类型:字典,列表

3、字典中方法:

增加:

dic1 = {'name':'alex'}

dic1 = ['age'] =18

*dic1 = {'age':18,'name':'alex'}

      dic1.setdefault() 键存在,不改动,返回字典相应键对应的值,键不存在,在字典中增加新的键值对,并返回相应的值

查找:

        通过键查找

          dic1.keys()打印字典中所有键 

  #dict1.keys['name','age']  --转换成列表:list(dic1.keys())

          dic1.values()打印字典中所有值

          dic1.items()打印所有键值对

修改:

          直接赋值

dic3= {'name':'alex','age':18}

dic4 = {'sex':'male','age':36}

          dic3.update(dic4)    #有相同的key,值会修改

删除:

          dic.clear()    #清空字典

          del dic['name'] #删除字典中指定键值对

          dic.pop('age')#删除字典中指定键值对,并返回该键值对的值

          dic.popitem()  #随机删除键值对,并以元组方式返回

其他操作涉及的方法:

dic1 =dict.formkeys(['host1','host2'],'test')#{'host1':'test','host2':'test'}

dic1 =dict.formkeys(['host1','host2','host3'],['test1','test2'])#{'host1':['test1','test2'],'host2':['test1','test2'],'host3':['test1','test2']}

dic1['host2'][1] = 'test3'   #{'host3':['test1''test3'],'host2':['test1''test3'],'host1':['test1''test3']}

      字典的嵌套:

      字典的排序:

      字典的遍历:

字符串的操作

a = '123'

b= 'abc'

c = a+b #123abc

c='****'.join([a,b])#123****abc

st = 'hello kitty{name} is {age}'

    st.count('l')    #2    统计元素个数

      st.captialize() #Hello kitty 首字母大写

      st.center(50,'-')#--------hello kitty --------居中

      st.endswith('tty3')#判断是否以某个内容结尾

      st.startswith('he')#判断是否以某个内容开头

      st.find('t') #8  查找第一个元素,并返回索引,不存在是返回-1

      st.format(name  = 'alex',age= 37)#hello kitty alex is 37

      st.format_map({'name' :'alex','age':27})#hello kitty alex is 27

      st.index('t') #8 返回索引,找不到报错

‘ab'.isalnum()

'123'.isdigit()