《利用Python进行数据分析2》—4

作者: 皮皮大 | 来源:发表于2019-07-16 19:20 被阅读1次

字典

  • 字典中的值是任意的对象
  • 字典中的键必须是不可变的对象,例如int、float、string、tuple等。不可变就是可哈希的,用hash()函数进行检查。
  • 列表要当做键可以先转成元组,list--->tuple
words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict2 = {}

for word in words:
    letter = word[0]
    dict2.setdefault(letter, []).append(word)   # 首字母不在,则更新字典中的键值对

setdefault:表示letter不在dict2中,返回空列表,再进行追加操作。

  • 通过collections模块来实现功能
from collections import defaultdict

words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict3 = defaultdict(list)
for word in words:
    dict3[word[0]].append(word)
dict3

# 结果
defaultdict(list,
            {'a': ['apple', 'autumn', 'as'],
             'b': ['book', 'bag'],
             'c': ['cook', 'car'],
             'd': ['dog']})

集合set

  • 用{}表示,和字典一样,只有键没有值{"book", "name", "shenzhen"}
  • 无序,不可重复,里面的元素不可变
  • 用set()函数或者{}进行创建,创建的过程中自动去重
  • 元素是不可变的,可以先转成元组再获取

操作方法

  • 并集union:a.union(b),|
  • 交集intersection:a.intersection(b),&
image.png

列表解析式

从一个元素过滤,形成列表,在传递参数的过程中还可以修改元素。

语句:[expr for val in collection if condition]

# 等价于
result = []
for val in collection:
    if condition:
    result.append(expr)

题目:将列表中的字符串长度小于3的全部改成大写

list1 = ["book", "car", "as", "go", "beautiful", "believe"]
[x.upper() for x in list1 if len(x) >3]  #  将列表中的字符串中的长度大于2的转成全部大写

['BOOK', 'BEAUTIFUL', 'BELIEVE']

等价于:

list2 = []
for x in list1:
    if len(x) > 3:
        list2.append(x.upper())
    else:
        pass
  • 字典和集合也是用类似于列表的推导式
set1 = {"book", "car", "python", "as"}
{len(x) for x in set1}

# 结果
{2, 3, 4, 6}

# 使用map函数
set(map(len, set1))   # map函数接受的参数:第一个是功能函数,第二个序列,最后用set()方法显式出来,也可以用list显式成列表形式
image.png

字典推导式

  • 注意val:index的写法,就是表达式
  • enumerate()函数同时获取序列中的索引和元素
dict4 = {val: index for index, val in enumerate(list1)}   

嵌套列表推导式

嵌套列表推导式:输出一个嵌套列表中的名字中含有两个e的名字

  • 用for循环解决
data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'],
        ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]

names_list = []
for names in data:
    name_e = [name for name in names if name.count("e") >= 2 ]
    names_list.extend(name_e)
>>name_list

['Steven']
  • 套列表推导式:条件是从大到小的写出来,先取出字典中的列表,再取出列表中的元素;过滤条件放在最后
>>result = [name for names in data for name in names if name.count("e") >= 2]
>>result

['Steven']

将一个整数元组的列表扁平化成一个整数列表

  • 通过两个for推导式解决,大范围在前
  • for表达式的顺序和嵌套顺序是相同的
tuples = [(1,2,3), (5,6), (7,8,9,10)]
list1 = [x for tup in tuples for x in tup]
list1

[1, 2, 3, 5, 6, 7, 8, 9, 10]
  • 嵌套可以是任意的;多层嵌套需要考虑代码可读性
  • 注意判断列表推导式的语法不通对结果的影响
>>tuples = [(1,2,3), (5,6), (7,8,9,10)]
>>list2 = [[x for x in tup] for tup in tuples]  
>>list2

[[1, 2, 3], [5, 6], [7, 8, 9, 10]]

函数

函数是Python中最重要的代码组织和复用手段。几个特征描述如下,具体内容可以参考Python札记17_初识函数function

  • 关键字def进行声明;return进行返回
  • 可以拥有多条return;如果到达函数末尾的时候没有遇到return语句,返回的是None
  • 函数有位置参数关键字参数
  • 关键字参数必须位于位置参数之后
  • 关键字参数通常用于指定默认值和可选参数
def func(x, y, z=2):   # x、y是位置参数;其中z是关键字参数
    if z > 1:
        return z * (x + y)
    else:
        return z * (x - y)
# 不同的参数指定方式
func(1, 2, z=2)
func(1, 2, 3)
func(1, 2)
func(x=4, y=6, z=8)   # 可读性高

命名空间、作用域和局部函数

两种变量:全局变量global和局部变量localPython中有一种更科学地描述变量作用域的名称,叫做命名空间

  • 任何在函数中赋值的变量,默认都是被分配到局部命名空间。
  • 局部命名空间是函数被调用时候创建的,函数参数会立即填入该空间中
  • 函数执行完毕,局部命名空间立即销毁
  • 在函数中对全局变量进行操作,必须先用global对变量进行声明。
# 函数执行完毕,局部命名空间会被销毁(除了闭包的情况)
def func():
    a = []
    for i in range(5):
        a.append(i)
        return a   # 第一次循环碰到return直接结束整个函数,返回[0]

b = func()
b   # [0]
def func():
    a = []
    for i in range(5):
        a.append(i)
    return a   # 循环5次之后再遇到return

b = func()
b

[0, 1, 2, 3, 4]

返回多个值

在Python中可以同时返回多个值,一般是元组的形式

def func():
    a = 5
    b = 6
    c = 7
    return a, b, c  # 返回的是元组形式

a, b, c = func()  # 将返回值分别给前面的3个变量
image.png

相关文章

网友评论

    本文标题:《利用Python进行数据分析2》—4

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