zoukankan      html  css  js  c++  java
  • 遍历(Iterable) everything

    简单的说,Python 中一个对象只要实现了__iter__() 或 getitem() 方法,就成为可迭代(Iterable)的对象,通俗的讲就是这个对象是可数的。常见的可迭代对象包括:列表(list)、元组(tuple)、字典(dict)、集合(set)、字符串(str)等。

    前言:处理迭代对象(Iterable)的三种方法

    1.zip

    zip() 是把几个可迭代对象(Iterable)叠在一起,按照对应0,1,2...的顺序将各个对象的重新分组,组成一个个元组(tuple),最后返回包含这些元组的列表(list)。

    在 Python 3.x 中 zip() 返回的是一个对象,如需展示列表,需手动 list() 转换。

    a = [1, 2, 3]
    b = [4, 5, 6]
    c = [7, 8, 9, 10]
    zz = zip(a, b)
    print(list(zz))
    # 输出 [(1, 4), (2, 5), (3, 6)]
    

    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。

    zz1 = zip(a, c)
    print(list(zz1))
    # 输出 [(1, 7), (2, 8), (3, 9)]
    

    利用 * 号操作符,可以将元组解压为列表。

    x,y = zip(*zz)
    print(x)
    print(y)
    # 输出 
    # (1, 2, 3)
    # (4, 5, 6)
    

    2.lambda

    Python中 lambda 指的是匿名函数,通俗的讲就是我在某处需要处理一些问题,又不想为此去单独定义一个函数,因为用一次就完了,不再用第二次,这个时候就需要这个 Lambda 匿名函数了。
    它的写法为:

    lambda arguments(所给的参数) : expression(表达式)
    比如参数 a 加 10 ,并返回结果

    x = lambda a : a + 10
    print(x(5))
    # 输出 5
    

    参数 a,b 相乘并返回结果

    x = lambda a, b : a * b
    print(x(5, 6))
    # 输出 30
    

    通常 lambda 与 map 结合来处理可迭代对象。

    3. map

    Python 中的 map 函数应用于可迭代对象的每一个元素,返回的是一个结果list。 如果有其他的可迭代参数传进来,map 函数则会把每一个参数都以相应的处理函数进行迭代处理。 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

    例如:

    a = [1, 2, 3, 4, 5]
    print(list(map(str,a)))
    # 输出 ['1', '2', '3', '4', '5']
    

    str 是 python 的内置函数,这里是把列表的每个元素变成了str类型,然后以列表的形式返回。 当然也可以传入自定义函数:

    def mul(x):
        return x*x
    n = [1, 2, 3, 4, 5]
    res = map(mul, n)
    print(list(res))
    # 输出 [1, 4, 9, 16, 25]
    

    这里的自定义函数完全可以用上面提到的匿名函数代替:

    res = map(lambda x: x*x, n)
    

    其输出结果是一样的。

    一,对dataframe的行和列进行遍历和修改**

    首先先定一个这样的字典,然后我们用不同的方法对其遍历和修改

    df=pd.DataFrame({"A":[1,2,3,4],"B":[5,6,7,8],"C":[1,1,1,1]})
       A  B  C
    0  1  5  1
    1  2  6  1
    2  3  7  1
    3  4  8  1
    

    i.遍历列

    1.ix函数(df.ix[条件,操作区域])
    df.ix[df.A>1,'B']=-1
    df
       A  B  C
    0  1  5  1
    1  2 **-1**  1
    2  3 **-1**  1
    3  4 **-1**  1
    
    2.iterrows()函数。

    这个函数一般跟index和row一起使用,应为他会返回两个值,一个就是index,一个是行

    for index,row in df.iterrows():
    	if row['A']>1:
    		row['B']=-1
       A  B  C
    0  1  5  1
    1  2 **-1**  1
    2  3 **-1**  1
    3  4 **-1**  1
    
    3.where函数,np.where(条件,then,else)
    df["then"]=np.where(df.A<3,1,0)
    df
       A  B  C  then
    0  1  5  1     1
    1  2  6  1     1
    2  3  7  1     0
    3  4  8  1     0
    
    4.apply函数你可以对行或列每一个数值进行自己指定函数的操作
    def judgeLevel(df):
        if df['A'] < 2:
            return 'C'
        elif df['A'] > 3:
            return 'A'
        else:
            return 'B'
    
     df['level']=df.apply(lambda r:judgeLevel(r),axis=1)
     df
       A  B  C   level
    0  1  5  1    C
    1  2  6  1    B
    2  3  7  1    B
    3  4  8  1    A
    

    ii.遍历列 - iloc函数

    for i in range(0, len(df)):
        print (df.iloc[i]['A'], df.iloc[i]['B'])
         1 5
         2 6
         3 7
         4 8
    

    Pandas对象之间的基本迭代的行为取决于类型。当迭代一个系列时,它被视为数组式,基本迭代产生这些值。其他数据结构,如:DataFrame和Panel,遵循类似惯例迭代对象的键。简而言之,基本迭代(对于i在对象中)产生。

    Series – 值
    DataFrame – 列标签
    Pannel – 项目标签

    (一) 迭代DataFrame**

    迭代DataFrame提供列名。现在来看看下面的例子来理解这个概念。

    import pandas as pd
    import numpy as np
    N=20
    
    df = pd.DataFrame({
        'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
        'x': np.linspace(0,stop=N-1,num=N),
        'y': np.random.rand(N),
        'C': np.random.choice(['Low','Medium','High'],N).tolist(),
        'D': np.random.normal(100, 10, size=(N)).tolist()
        })
    
    for col in df:
       print (col)
    

    执行上面示例代码,得到以下结果 –

    A
    C
    D
    x
    y
    

    要遍历数据帧(DataFrame)中的行,可以使用以下函数 –
    • iteritems() – 迭代(key,value)对
    • iterrows() – 将行迭代为(索引,系列)对
    • itertuples() – 以namedtuples的形式迭代行

    (二) iteritems()示例

    将每个列作为键,将值与值作为键和列值迭代为Series对象。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
    for key,value in df.iteritems():
       print(key,value)
    

    执行上面示例代码,得到以下结果 –

    col1 0    0.459280
    1    0.302563
    2   -0.925297
    3   -1.701360
    Name: col1, dtype: float64
    col2 0   -2.577661
    1   -0.840329
    2    0.277956
    3    0.141397
    Name: col2, dtype: float64
    col3 0   -0.819635
    1    0.826029
    2   -0.038953
    3    0.379977
    Name: col3, dtype: float64
    

    观察一下,单独迭代每个列作为系列中的键值对。

    (三) iterrows()示例

    iterrows()返回迭代器,产生每个索引值以及包含每行数据的序列。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
    for row_index,row in df.iterrows():
       print(row_index,row)
    

    执行上面示例代码,得到以下结果 –

    0 col1    0.589103
    col2   -1.344540
    col3   -0.273822
    Name: 0, dtype: float64
    1 col1   -1.799794
    col2    0.191032
    col3   -0.470350
    Name: 1, dtype: float64
    2 col1    1.538743
    col2   -0.443371
    col3   -1.234744
    Name: 2, dtype: float64
    3 col1   -1.700915
    col2    0.637768
    col3    0.320671
    Name: 3, dtype: float64
    

    注意 – 由于iterrows()遍历行,因此不会跨该行保留数据类型。0,1,2是行索引,col1,col2,col3是列索引。

    (四) itertuples()示例

    itertuples()方法将为DataFrame中的每一行返回一个产生一个命名元组的迭代器。元组的第一个元素将是行的相应索引值,而剩余的值是行值。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
    for row in df.itertuples():
        print(row)
    

    执行上面示例代码,得到以下结果 –

    Pandas(Index=0, col1=-0.459994067109029, col2=-1.3589032966943688, col3=-0.8378124266875753)
    Pandas(Index=1, col1=-0.675609143041429, col2=0.9365900839103676, col3=0.16686318229869906)
    Pandas(Index=2, col1=-0.32119668362802845, col2=0.31388056160597017, col3=1.3433307873076799)
    Pandas(Index=3, col1=1.2368409605416566, col2=1.184780890409777, col3=-0.27277256974192443)
    

    注意 – 不要尝试在迭代时修改任何对象。迭代是用于读取,迭代器返回原始对象(视图)的副本,因此更改将不会反映在原始对象上。

    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
    
    for index, row in df.iterrows():
       row['a'] = 10
    print(df)
    

    执行上面示例代码,得到以下结果 –

           col1      col2      col3
    0  0.534370  0.245170  0.247378
    1 -0.375285 -0.370878 -0.258897
    2  0.910811 -1.566585 -0.857689
    3  0.468804 -1.407227 -0.791819
    

    注意观察结果,修改变化并未反映出来。

    二,遍历字典 ( Dict )**

    d.items()将字典转换为可遍历的列表

    d = {'a':1,'b':2,'c':3}
    for key, val in d.items():
        print(key,val)
    
    输出:
    a 1
    b 2
    c 3
    

    d.items()
    dict_items([('a', 1), ('b', 2), ('c', 3)])
    下面的写法会报错

    In [180]: d = {'a':1,'b':2,'c':3}
    In [181]: for key, val in d:
         ...:     print(key,val)
         ...: 
    ---------------------------------------------------------------------------
    ValueError: not enough values to unpack (expected 2, got 1)
    

    可以这样写,直接遍历所有的键

    In [180]: d = {'a':1,'b':2,'c':3}
    In [183]: for key in d:
         ...:     print(key)
         ...: 
    

    字典遍历
    .keys() 获取字典的所有键,生成一个列表,通过遍历key键来实现字典的遍历

    >>> students={'姓名':'小明','年龄':'22','联系方式':'123456','邮箱':'sunyue2019@qq.com','住址':'地球村'}
    >>> students
    {'姓名': '小明', '年龄': '22', '联系方式': '123456', '邮箱': 'sunyue2019@qq.com', '住址': '地球村'}
    >>> for key in students.keys():
    	print('%s是%s'%(key,students[key]))
     
    姓名是小明
    年龄是22
    联系方式是123456
    邮箱是sunyue2019@qq.com
    住址是地球村
    

    .values() 获取字典的所有值,生成一个列表,可以来直接遍历value值

    >>> for var in students.values():
    	print('获取的值为:%s'%var)
     
    	
    获取的值为:小明
    获取的值为:22
    获取的值为:123456
    获取的值为:sunyue2019@qq.com
    获取的值为:地球村
    

    .items() 获取所有键值对,生成一个具有键值对的复合元组,可以来遍历字典的键与值(元素)
    ( 通过两个变量进行一次性赋值,遍历key-value(键值对))

    for key,var in students.items():
    print('键为%s,值为%s'%(key,var))

    键为姓名,值为小明
    键为年龄,值为22
    键为联系方式,值为123456
    键为邮箱,值为sunyue2019@qq.com
    键为住址,值为地球村

    三,enumerate()的用法

    Python enumerate() 函数, 该函数可用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
    语法
    enumerate(sequence, [start=0])
    参数
    sequence -- 一个序列、迭代器或其他支持迭代对象。
    start -- 下标起始位置。
    返回值
    返回 enumerate(枚举) 对象。

    实例
    以下展示了使用 enumerate() 方法的实例:

    >>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
    >>> list(enumerate(seasons))
    [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
    >>> list(enumerate(seasons, start=1))       # 下标从 1 开始
    [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
    
    普通的 for 循环
    >>>i = 0
    >>> seq = ['one', 'two', 'three']
    >>> for element in seq:
    ...     print i, seq[i]
    ...     i +=1
    ... 
    0 one
    1 two
    2 three
    
    for 循环使用 enumerate
    >>>seq = ['one', 'two', 'three']
    >>> for i, element in enumerate(seq):
    ...     print i, element
    ... 
    0 one
    1 two
    2 three
    
  • 相关阅读:
    缩水版遗传算法 学习笔记
    算法导论 二项堆
    Linux系统编程(6)——文件系统
    Linux系统编程(5)——文件与IO之mmap函数
    Linux系统编程(4)——文件与IO之ioctl函数
    Linux系统编程(3)——文件与IO之fcntl函数
    Linux系统编程(2)——文件与IO之系统调用与文件IO操作
    Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O
    C语言的本质(38)——makefile之变量
    C语言的本质(37)——makefile之隐含规则和模式规则
  • 原文地址:https://www.cnblogs.com/treasury-manager/p/13817046.html
Copyright © 2011-2022 走看看