• Python 创建字典与fromkeys的坑


    字典很重要

    字典dict 是Python中很重要的一个数据类型, 通过键值映射, 能够很好的定位查找.

    Django, Flask这些Web框架在做前后端分离时, 就是用字典传数据的, 因为它和列表list 配合起来, 能够很好的与json格式的数据相互转化. 用Flask + Echarts做数据可视化大屏, 传的变量都是字典和列表.

    简单创建字典

    这是最简单的创建字典的方式:

    dic = {'key1': 'value1', 'key2': 'value2'}
    dic = dict(key1='value1', key2='value2')
    

    快速创建字典

    但当数据特别多的时候, 一个个手敲键值构造字典, 这样非常麻烦.

    Python提供了许多快速创建字典的方式,

    >>> d = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
    >>> d
    {'one': 1, 'two': 2, 'three': 3}
    
    >>> d = dict([('two', 2), ('one', 1), ('three', 3)])
    >>> d
    {'two': 2, 'one': 1, 'three': 3}
    

    nb的fromkeys

    除此之外还有一个超级nb的方法, fromkeys. 为什么说他nb呢?

    https://docs.python.org/3/library/stdtypes.html#dict.fromkeys

    >>> import numpy as np
    
    >>> data = dict.fromkeys(np.arange(10))
    >>> data
    {0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
    >>> data = dict.fromkeys(np.arange(10), '都是一样的')
    >>> data
    {0: '都是一样的', 1: '都是一样的', 2: '都是一样的', 3: '都是一样的', 4: '都是一样的', 5: '都是一样的', 6: '都是一样的', 7: '都是一样的', 8: '都是一样的', 9: '都是一样的'}
    

    比如我执行一个sql语句, 返回一个巨大的元组或列表, 而我又暂时不确定它的值是什么, 就可以这样批量创建, 值先为None, 或者随便赋一个值

    我对它真是有爱又恨, 它的一个弊端: 值必须是一个不可变对象

    • 可变对象: int, str, float, tuple

    • 不可变对象: list, dict

    这意味着不可以设它的值为list 或dict, 这可糟了呀, 往Echarts传值大多都是dict+list, 还有pandas中的DataFrame等都是dict+list的格式, 像这种:

    from pandas import DataFrame
    
    data = {
        'Singer': ['the rolling stones', 'Beatles', 'Guns N Roses', 'Metalica'],
        'Song_name': ['Satisfaction', 'Let it Be', 'Don’t Cry', 'Nothing Else Matters'],
        'Year': [2000, 2001, 2000, 2002]
    }
    music_data2 = DataFrame(data)
    

    看一看如果偏要设值为list对发生什么:

    >>> import numpy as np
    
    >>> data = dict.fromkeys(np.arange(10), [])
    >>> data[1].append('a')
    >>> data
    {0: ['a'], 1: ['a'], 2: ['a'], 3: ['a'], 4: ['a'], 5: ['a'], 6: ['a'], 7: ['a'], 8: ['a'], 9: ['a']}
    

    wc***, fromkeys你不讲码德, 我只是修改了键为1的值, 怎么全都修改了!!!

    那就这样完了吗?

    可以先把设为一个不可变类型, 比如字符串str, 最后再将它转化成想要的列表就成功啦

    >>> import numpy as np
    
    >>> data = dict.fromkeys(np.arange(10), '')
    >>> data[1] += 'a,'
    >>> data[1] += 'b,'
    >>> data = {key: value.split(',')[:-1] for key, value in data.items()}
    >>> data
    {0: [], 1: ['a', 'b'], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}
    
  • 相关阅读:
    JS处理日期&字符串格式相互转换
    Ajax 原理过程 同步与异步区别 优缺点
    元素居中
    width:100%;与width:auto;的区别
    URL、URI和URN三者之间的区别
    JavaScript encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent()
    CSS 笔记三(Tables/Box Model/Outline)
    CSS 笔记二(Text/Fonts/Links/Lists)
    CSS 笔记一(Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width)
    javascript,jQuery,trim()
  • 原文地址:https://www.cnblogs.com/pineapple-py/p/14176629.html
Copyright © 2020-2023  润新知