Python之列表及字典生成式

Python之列表及字典生成式

  • 什么是列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
通常是对列表里面的数据进行运算和操作,生成新的列表最高效快速的办法

  • 列表生成式的示例

1.接受变量k a b
常规if循环:

[kiosk@foundation13 ~]$ vim test.py 
[kiosk@foundation13 ~]$ cat test.py
s = '51 5000 10000'
a = s.split()
li = []
for item in s.split():
     li.append(int(item))
print(li)
k,a,b = li
print(k,a,b)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test.py 
[51, 5000, 10000]
51 5000 10000

列表生成式:

[kiosk@foundation13 ~]$ vim liebiao.py
[kiosk@foundation13 ~]$ cat liebiao.py 
s = '51 5000 10000'
li = [int(item) for item in s.split()]
print(li)
k, a, b = li
print(k, a, b)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao.py 
[51, 5000, 10000]
51 5000 10000

2.生成一个列表,列表的元素分别为[11 22 9**9 ]
常规for循环:

[kiosk@foundation13 ~]$ vim test1.py
[kiosk@foundation13 ~]$ cat test1.py 
li = []
for i in range(1, 10):
    li.append(i ** i)
print(li)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test1.py 
[1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]

列表生成式:

[kiosk@foundation13 ~]$ vim liebiao1.py
[kiosk@foundation13 ~]$ cat liebiao1.py
print([i ** i for i in range(1, 10)])
print([i ** i for i in range(1, 10) if i % 2 == 0])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao1.py 
[1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
[4, 256, 46656, 16777216]

3.找出1-10之间的所有偶数
列表生成式:

[kiosk@foundation13 ~]$ vim liebiao2.py
[kiosk@foundation13 ~]$ cat liebiao2.py 
print([i for i in range(1,11) if i %2 == 0])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao2.py 
[2, 4, 6, 8, 10]

4.s1 = ‘ABC’ s2=‘123’ 打印成A1 A2 A3…C1 C2 C3
列表生成式:

[kiosk@foundation13 ~]$ vim liebiao3.py
[kiosk@foundation13 ~]$ cat liebiao3.py 
print([i + j for i in 'ABC' for j in '123'])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao3.py 
['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

5.li=[[1,2,3],[4,5,6],[7,8,9]] 要求输出为[1,2,3,4,5,6,7,8,9]
常规for循环:

[kiosk@foundation13 ~]$ vim test2.py
[kiosk@foundation13 ~]$ cat test2.py 
li = [[1,2,3],[4,5,6],[7,8,9]]
resli = []
for item1 in li: #[1,2,3] [4,5,6] [7,8,9]
    for item2 in item1:
        resli.append(item2)
print(resli)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test2.py
[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表生成式:

[kiosk@foundation13 ~]$ vim liebiao4.py
[kiosk@foundation13 ~]$ cat liebiao4.py 
li = [[1,2,3],[4,5,6],[7,8,9]]
print([item2 for item1 in li for item2 in item1])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao4.py 
[1, 2, 3, 4, 5, 6, 7, 8, 9]

调用chain模块:

[kiosk@foundation13 ~]$ vim lie.py
[kiosk@foundation13 ~]$ cat lie.py 
from itertools import chain
li = [[1,2,3],[4,5,6],[7,8,9]]
print(list(chain(*li)))
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 lie.py 
[1, 2, 3, 4, 5, 6, 7, 8, 9]

5.1.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的园的面积)
常规for循环:

[kiosk@foundation13 ~]$ vim test3.py
[kiosk@foundation13 ~]$ cat test3.py 
import math
li = []
for r in range(2, 11, 2):
    square = math.pi * r * r
    li.append(square)
print(li)
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test3.py 
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

列表生成式:

[kiosk@foundation13 ~]$ vim liebiao5.py
[kiosk@foundation13 ~]$ cat liebiao5.py 
import math
print([math.pi * r * r for r in range(2, 11, 2)])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 liebiao5.py 
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

函数+列表生成式:

[kiosk@foundation13 ~]$ vim lie1.py
[kiosk@foundation13 ~]$ cat lie1.py 
import math
def square(r):
    """
    求以r为半径的圆
    :param r:半径
    :return:
    """
    res = math.pi * r * r
    return res
print([square(i) for i in range(2,11,2)])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 lie1.py 
[12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676, 314.1592653589793]

6.找出1~100之间的所有素数
函数+列表生成式:

[kiosk@foundation13 ~]$ vim lie2.py
[kiosk@foundation13 ~]$ cat lie2.py 
def isPrime(num):
    for i in range(2,num):
        if num % i == 0:
            return False
    else:
        return True

print([i for i in range(2,101) if isPrime(i)])
[kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 lie2.py 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

7.列表的字符串的大写改成小写,不是字符串的去掉

>>> li = ['hello','World',16,17,12.3,False,'Apple']
>>> print([s for s in li if isinstance(s,float)])
[12.3]
>>> print([s for s in li if isinstance(s,str)])
['hello', 'World', 'Apple']
>>> print([s.lower() for s in li if isinstance(s,str)])
['hello', 'world', 'apple']

8.找出/var/log目录中,所哦与一.log结尾的文件名或目录名

>>> import os
>>> print(os.listdir('/var/log/'))
['tallylog', 'glusterfs', 'lastlog', 'wtmp', 'samba', 'libvirt', 'pluto', 'audit', 'chrony', 'ppp', 'rhsm', 'speech-dispatcher', 'gdm', 'cron-20190512', 'sa', 'tuned', 'yum.log', 'openvswitch', 'anaconda', 'firewalld', 'maillog', 'dmesg.old', 'Xorg.0.log.old', 'cron-20190521', 'cron', 'secure-20190526', 'spooler-20190521', 'messages-20190507', 'maillog-20190512', 'Xorg.1.log.old', 'Xorg.1.log', 'cron-20190526', 'spooler-20190526', 'Xorg.0.log', 'wpa_supplicant.log-20190530', 'messages-20190526', 'spooler', 'secure-20190521', 'messages-20190512', 'wpa_supplicant.log', 'secure-20190507', 'spooler-20190512', 'maillog-20190507', 'httpd', 'maillog-20190526', 'wpa_supplicant.log-20190528', 'boot.log', 'maillog-20190521', 'dmesg', 'wpa_supplicant.log-20190524', 'spooler-20190507', 'btmp-20190501', 'btmp', 'cron-20190507', 'wpa_supplicant.log-20190522', 'messages', 'secure-20190512', 'messages-20190521', 'secure']
>>> print(os.system('pwd'))
/home/kiosk
0
>>> print([filename for filename in os.listdir('/var/log/') if filename.endswith('.log')])
['yum.log', 'Xorg.1.log', 'Xorg.0.log', 'wpa_supplicant.log', 'boot.log']
  • 列表生成式综合练习

1.题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 1x1+ 3x3 = 10 f(207) = 2x2 + 0x0+ 7x7 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,且kf(n)=n
输入:第一行包含3个正整数k,a, b, k>=1, a,b<=10**18, a<=b;
输出:输出对应的答案;
范例:输入: 51 5000 10000输出:3

def f(n):
    a = 0
    m = str(n)
    for i in m:
        a += int(i) ** 2
    return a

three = input('请输入三个整数,并用空格隔开:')
threes = three.split(' ')
x = int(threes[0])
y = int(threes[1])
z = int(threes[2])
sum = 0
if x >= 1 and y <= z <= 10 ** 18:
    for i in range(y, z + 1):
        if x * f(i) == i:
            sum += 1
    print(sum)
else:
    print('请重新输入数据!!')

2.题目描述:给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
[2,3,5,7]
输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数:
示例1 :输入:10输出:2

num = int(input('N:'))
#1.判断2~num之间有多少个质数
def isPrime(num):
     for i in range(2,num):
         if num % i == 0:
             return False
     else:
         return True

primeli = [i for i in range(2,101) if isPrime(i)]
print(primeli)

#判断质数列表 primeli中有多少个质数等于num
#primePairCount  = 0

#1.先从列表中拿出两个数
#2.判断两个数之和是否等于num
for item1 in primeli:
     for item2 in primeli:
             if item1 + item2 == num and item1 <= item2:
				primePairCount += 1
print(primePairCount)

for item1 in primeli:
     if (num - item1) in primeli and item1 <= num-item1:
		primePairCount += 1
print(primePairCount)
  • 字典生成式的示例

1.假设有20个学生,学生的分数在60~100之间,筛选出成绩在90分以上的学生

import random
stuInfo = {}
for i in range(20):
     name = 'westos' + str(i)
     score = random.randint(60, 100)
     stuInfo[name] = score
print(stuInfo)

highscore = {}
for name,score in stuInfo.items():
     if score > 90:
              highscore[name] = score
print(highscore)
print({name: score for name, score
        in stuInfo.items() if score > 90})

2.将所有的key值都变成大写

d = dict(a=1, b=2)
print(d)
new_d = {}
for i in d:
     new_d[i.upper()] = d[i]
print('key转换为大写的字典:',new_d)
print({k.upper(): v for k, v in d.items()})

3.大小写的key值合并,统一以小写输出
d = dict(a=1, b=2, c=3, B=9, A=10)
a=11 b=11 c=2

常规if循环:

d = dict(a=1, b=2, c=3, B=9, A=10)
new_d = {}
for k,v in d.items():
     low_k = k.lower()
     if low_k not in new_d:
         new_d[low_k] = v
     else:
         new_d[low_k] += v
print(new_d)

列表生成式:

d = dict(a=1, b=2, c=3, B=9, A=10)
print({k.lower():d.get(k.upper(),0)+d.get(k.lower(),0)
       for k in d})

END

猜你喜欢

转载自blog.csdn.net/weixin_44828950/article/details/90695261
今日推荐