zoukankan      html  css  js  c++  java
  • python3 列表/字典/集合推导式

    '''各种推导式
        列表推导式:[结果 for循环 if条件]
        字典推导式:[k:v for循环 if条件]
        集合推导式:{结果 for循环 if条件}
        没有元组推导式:
        生成器推导式:(结果 for循环 if条件)
    '''
    '''生成器表达式:(结果 for 循环 if 条件)'''
    
    g = (i * 2 for i in range(10) if i %2 == 0)
    print(g)  # 此时打印的就是一个生成器对象,并不是数据
    print(list(g))  # list()函数可以把一个生成器拿空,并拿到列表[0, 4, 8, 12, 16]
    '''迭代器:可以一个一个的拿到数据,具有__iter__和__next__方法
    可迭代对象:具有__iter__的方法
    通过__iter__可以拿到一个对象的迭代器
    迭代器特点:
        1.省内存(生成器)
        2.惰性机制(不执行__next__不拿值)
        3.只能向前,不能反复(拿光了就没了)
    
    for循环内部使用的就是迭代器。
    当一个迭代器内的元素被拿空之后,继续执行__next__会报错:StopIteration
    
    生成器本质就是迭代器。
    生成器有两种创建方式:
        1、生成器函数
        2、生成器表达式
        
    生成器函数:函数内部有yield语句就是生成器函数
    '''
    def gen():
        print(111)
        yield "apple"
    g = gen()  # 注意,这句话并没有执行gen()这个函数,而是通过gen函数创建了一个生成器
    ret = g.__next__()  # 此时才开始执行生成器,并返回yield后面的数据。 返回:111
    print(ret)  # apple
    '''集合推导式{key for循环 if语句}'''
    lst = [3, 5, 1, 5, 2, 1, 7]
    s = {i for i in lst}
    print(s)
    
    返回结果:
    {1, 2, 3, 5, 7}
    '''字典推导式{key:value fox循环 if语句}'''
    lst = ["apple", "orange", "banana"]
    dic = {k:v for k,v in enumerate(lst)}
    print(dic)
    
    返回结果:
    {0: 'apple', 1: 'orange', 2: 'banana'}
    '''在[3,6,9]的基础上推到出[[1,2,3], [4,5,6],[7,8,9]]'''
    print([[i-2, i-1, i] for i in [3, 6, 9]])
    
    返回结果:
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    [0, 1, 2, 3, 4, 25, 36, 49, 64, 81]
    [25, 36, 49, 64, 81]
    ['apple', 'orange']
    [1, 4, 9, 16, 25, 36]
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    '''使用列表推导式得到[1, 4, 9, 16, 25, 36]'''
    print([i*i for i in range(1, 7)])
    '''列表生成式可以快速的创建一个列表'''
    lst = [i*i for i in range(10)]
    print(lst)
    lst2 = [i if i < 5 else i*i for i in range(10)]
    print(lst2)
    lst3 = [i*i for i in range(10) if i >= 5]
    print(lst3)
    lst4 = [i for i in ["apple", "orange", "banana", "pear"] if i.endswith("e")]
    print(lst4)
    '''
    列表推导式[结果 for 变量 in 可迭代对象 if 条件]
    获取1-100内所有的偶数
    '''
    lst = [i for i in range(1, 101) if i % 2 == 0]
    print(lst)
    [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
    '''生成器表达式:(结果 for 变量 in 可迭代对象)'''
    gen = (i for i in range(10))
    print(gen)  # <generator object <genexpr> at 0x0000000007B28200>
    print(list(gen))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    <generator object <genexpr> at 0x0000000007A8B728>
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    '''
    生成器表达式:(结果 for 变量 in 可迭代对象 if条件)
    获取1-100内能被3整除的数
    '''
    gen = (i for i in range(1, 100) if i %3 == 0)
    print(gen)  # <generator object <genexpr> at 0x0000000006085D58>
    print(list(gen))  # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    <generator object <genexpr> at 0x0000000006085D58>
    [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    '''100以内能被3整除的数的平方'''
    gen = (i**2 for i in range(1, 100) if i % 3 == 0)
    print(gen)  # <generator object <genexpr> at 0x0000000007A8B258>
    print(list(gen))
    <generator object <genexpr> at 0x0000000007A8B258>
    [9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304, 2601, 2916, 3249, 3600, 3969, 4356, 4761, 5184, 5625, 6084, 6561, 7056, 7569, 8100, 8649, 9216, 9801]
    '''(结果 for 变量1 in 可迭代对象 for 变量 in 变量1 if条件)
    寻找名字中带有两个e的人的名字
    '''
    names = [["tom", "Billy", "Jefferson", "Andrew", "Wesley", "Steven", "Joe"],
            ["Alice", "Jill", "Ana", "Wendy", "Jennifer", "Sherry", "Eva"]]
    gen = (name for name_lst in names for name in name_lst if name.count("e") > 1)
    print(gen)  # <generator object <genexpr> at 0x0000000006085CA8>
    print(list(gen))  # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    <generator object <genexpr> at 0x0000000006085CA8>
    ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    '''生成器表达式和列表推导式的区别
        1、列表推导式比较耗内存,一次性加载。生成器表达式几乎不占用内存,使用的时候才分配和使用内存。
        2、得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器。
    '''
    '''生成器,取值的时候才拿值'''
    def func():
        print(111)
        yield 222
        
    g = func()  # 生成器g
    g1 = (i for i in g)  # 生成器g1
    g2 = (i for i in g1)  # 生成器g2
    
    print(list(g))  # 111 [222]
    print(list(g1))  # []
    print(list(g2))  # []
    111
    [222]
    []
    []
    '''字典推导式{k:v for 变量 in 可迭代对象}'''
    dic = {"a": 1, "b": 2}
    new_dic = {dic[key]: key for key in dic}
    print(new_dic)  # {1: 'a', 2: 'b'}
    
    dic2 = {dic[k]:k for k in dic}
    print(dic2)  # {1: 'a', 2: 'b'}
    {1: 'a', 2: 'b'}
    {1: 'a', 2: 'b'}
    '''一个列表元素作为键值,一个列表元素作为值'''
    lst = ["apple" , "banana", "orange"]
    lst2 = ["苹果", "香蕉", "桔子"]
    dic = {lst[i]: lst2[i] for i in range(len(lst))}
    print(dic)  # {'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
    {'apple': '苹果', 'banana': '香蕉', 'orange': '桔子'}
    '''
    集合推导式: {结果 for 变量 in 可迭代对象}
    取绝对值
    '''
    lst = [1, -1, 8, -8 , 12]
    s = {abs(i) for i in lst}
    print(s)  # {8, 1, 12}
    {8, 1, 12}
  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10762281.html
Copyright © 2011-2022 走看看