Python 列表推导式的实用小技巧

1. 产生200个1000以内的随机数

>>> L1=[random.randrange(1,1000) for _ in range(200)]
>>> type(L1)
<class 'list'>
>>> for i,L in enumerate(L1):
	if (i+1)%10: print(L,end='\t')
	else: print(L)

	
842	566	188	863	569	79	91	585	133	866
943	636	359	166	648	615	61	239	144	758
196	61	795	980	255	147	796	158	110	440
51	214	359	85	420	570	725	367	408	368
660	926	465	373	143	440	628	235	261	535
110	422	119	964	9	825	324	556	860	292
911	399	728	877	42	177	947	382	695	225
816	591	458	837	452	627	421	694	5	425
834	374	728	558	831	596	784	548	462	359
219	714	285	883	183	321	514	522	700	628
919	175	776	508	240	94	779	365	12	961
858	835	801	239	359	77	311	930	783	935
248	394	689	959	373	561	252	342	33	712
633	802	236	934	262	358	797	932	432	704
499	962	73	766	21	956	673	690	833	848
758	908	854	811	68	961	640	103	363	693
499	381	377	390	202	187	16	119	441	103
507	77	60	534	342	396	809	411	273	726
619	911	645	21	550	879	587	119	964	956
461	572	993	405	651	71	102	101	640	259
>>> 

2. 在上述列表L1中,找出3的倍数或包含3的数字

>>> L2 = [i for i in L1 if i%3==0 or '3' in str(i)]
>>> type(L2)
<class 'list'>
>>> for i,L in enumerate(L2):
	if (i+1)%10: print(L,end='\t')
	else: print(L)

	
863	585	133	943	636	359	648	615	239	144
795	255	147	51	359	420	570	367	408	368
660	465	373	143	235	261	535	9	825	324
399	42	177	382	225	816	591	837	627	834
374	558	831	462	359	219	714	285	883	183
321	522	240	365	12	858	835	801	239	359
311	930	783	935	394	373	561	252	342	33
633	236	934	358	932	432	73	21	673	690
833	103	363	693	381	377	390	441	103	507
60	534	342	396	411	273	726	645	21	879
993	405	651	102	
>>> 

3. 把上述列表L2去掉重复数字,并升序输出

>>> L3=[i for i in sorted(set(L2))]
>>> type(L3)
<class 'list'>
>>> for i,L in enumerate(L3):
	if (i+1)%10: print(L,end='\t')
	else: print(L)

	
9	12	21	33	42	51	60	73	102	103
133	143	144	147	177	183	219	225	235	236
239	240	252	255	261	273	285	311	321	324
342	358	359	363	365	367	368	373	374	377
381	382	390	394	396	399	405	408	411	420
432	441	462	465	507	522	534	535	558	561
570	585	591	615	627	633	636	645	648	651
660	673	690	693	714	726	783	795	801	816
825	831	833	834	835	837	858	863	879	883
930	932	934	935	943	993	
>>>
>>> min(L3),max(L3)
(9, 993)
>>> 

4. 用阿拉伯数字替换中文序号

>>> L4=['第一讲.pdf', '第七讲.pdf', '第三讲.pdf', '第二讲.pdf', '第五讲.pdf', '第六讲.pdf', '第四讲.pdf']
>>> L4
['第一讲.pdf', '第七讲.pdf', '第三讲.pdf', '第二讲.pdf', '第五讲.pdf', '第六讲.pdf', '第四讲.pdf']
>>> L4=[i.replace(i[1],str('一二三四五六七八九'.index(i[1])+1)) for i in L4]
>>> L4
['第1讲.pdf', '第7讲.pdf', '第3讲.pdf', '第2讲.pdf', '第5讲.pdf', '第6讲.pdf', '第4讲.pdf']
>>> 
>>> [i for i in sorted(L4)]
['第1讲.pdf', '第2讲.pdf', '第3讲.pdf', '第4讲.pdf', '第5讲.pdf', '第6讲.pdf', '第7讲.pdf']
>>>
>>> D1={i+1:L for i,L in enumerate(sorted(L4))}
>>> D1
{1: '第1讲.pdf', 2: '第2讲.pdf', 3: '第3讲.pdf', 4: '第4讲.pdf', 5: '第5讲.pdf', 6: '第6讲.pdf', 7: '第7讲.pdf'}
>>> 

5.  遍历指定文件夹下的某一种后缀的文件

>>> import os
>>> docPath='C:\\Users\\Administrator\\Desktop\\查询结果'
>>> [fn[:-5] for fn in [files for path,dirs,files in os.walk(docPath)][0] if fn[-5:]=='.xlsx']
['322986441', '322986442', '322986443', '322986444', '322986445']
>>> 

6. 分离英文单词列表中的中英文

>>> words='''
cat 猫 dog 狗 pig 猪 duck 鸭 rabbit 兔 horse 马 elephant 大象 
ant 蚂蚁 fish 鱼 bird 鸟 eagle 鹰 beaver 海狸 snake 蛇 mouse 老鼠 
squirrel 松鼠 kangaroo 袋鼠 monkey 猴 panda 熊猫 bear 熊 lion 狮子 
tiger 老虎 fox 狐狸 zebra 斑马 deer 鹿 giraffe 长颈鹿 goosr 鹅 
hen 母鸡 turkey 火鸡 lamb 小羊 sheep 绵羊 goat 山羊 cow 奶牛 
donkey 驴 squid 鱿鱼 lobster 龙虾 shark 鲨鱼 seal 海豹
'''
>>> CN=[i for i in words.split() if '\u4e00' <= i <= '\u9fff']
>>> EN=[i for i in words.split() if not '\u4e00' <= i <= '\u9fff']
>>>
>>> CN
['猫', '狗', '猪', '鸭', '兔', '马', '大象', '蚂蚁', '鱼', '鸟', '鹰', '海狸', '蛇', '老鼠', '松鼠', '袋鼠', '猴', '熊猫', '熊', '狮子', '老虎', '狐狸', '斑马', '鹿', '长颈鹿', '鹅', '母鸡', '火鸡', '小羊', '绵羊', '山羊', '奶牛', '驴', '鱿鱼', '龙虾', '鲨鱼', '海豹']
>>> EN
['cat', 'dog', 'pig', 'duck', 'rabbit', 'horse', 'elephant', 'ant', 'fish', 'bird', 'eagle', 'beaver', 'snake', 'mouse', 'squirrel', 'kangaroo', 'monkey', 'panda', 'bear', 'lion', 'tiger', 'fox', 'zebra', 'deer', 'giraffe', 'goosr', 'hen', 'turkey', 'lamb', 'sheep', 'goat', 'cow', 'donkey', 'squid', 'lobster', 'shark', 'seal']
>>> 

7. 把上述EN列表中单词分成单元音、双元音和多元音三类

>>> EN1=[i for i in EN if i.count('a')+i.count('e')+i.count('i')+i.count('o')+i.count('u')==1]
>>> EN2=[i for i in EN if i.count('a')+i.count('e')+i.count('i')+i.count('o')+i.count('u')==2]
>>> EN3=[i for i in EN if i.count('a')+i.count('e')+i.count('i')+i.count('o')+i.count('u')>2]
>>>
>>> EN1
['cat', 'dog', 'pig', 'duck', 'ant', 'fish', 'bird', 'fox', 'hen', 'lamb', 'cow', 'shark']
>>> EN2
['rabbit', 'horse', 'snake', 'monkey', 'panda', 'bear', 'lion', 'tiger', 'zebra', 'deer', 'goosr', 'turkey', 'sheep', 'goat', 'donkey', 'squid', 'lobster', 'seal']
>>> EN3
['elephant', 'eagle', 'beaver', 'mouse', 'squirrel', 'kangaroo', 'giraffe']
>>> 

8. 找出单词(包含2个或2个以上字母e)的中文意思

方法一:

>>> CN1 = [[EN,CN][1][[EN,CN][0].index(i)] for i in [EN,CN][0] if i.count('e') > 1]
>>> CN1
['大象', '鹰', '海狸', '鹿', '绵羊']

方法二:

>>> CN2 = [i.split(' ')[1] for i in [' '.join(i) for i in zip(EN, CN)] if i.count('e') > 1]
>>> CN2
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> 

两者的区别在于:

>>> [EN,CN]
[['cat', 'dog', 'pig', 'duck', 'rabbit', 'horse', 'elephant', 'ant', 'fish', 'bird', 'eagle', 'beaver', 'snake', 'mouse', 'squirrel', 'kangaroo', 'monkey', 'panda', 'bear', 'lion', 'tiger', 'fox', 'zebra', 'deer', 'giraffe', 'goosr', 'hen', 'turkey', 'lamb', 'sheep', 'goat', 'cow', 'donkey', 'squid', 'lobster', 'shark', 'seal'], ['猫', '狗', '猪', '鸭', '兔', '马', '大象', '蚂蚁', '鱼', '鸟', '鹰', '海狸', '蛇', '老鼠', '松鼠', '袋鼠', '猴', '熊猫', '熊', '狮子', '老虎', '狐狸', '斑马', '鹿', '长颈鹿', '鹅', '母鸡', '火鸡', '小羊', '绵羊', '山羊', '奶牛', '驴', '鱿鱼', '龙虾', '鲨鱼', '海豹']]
>>> zip(EN,CN)
<zip object at 0x02E384E8>
>>> list(zip(EN,CN))
[('cat', '猫'), ('dog', '狗'), ('pig', '猪'), ('duck', '鸭'), ('rabbit', '兔'), ('horse', '马'), ('elephant', '大象'), ('ant', '蚂蚁'), ('fish', '鱼'), ('bird', '鸟'), ('eagle', '鹰'), ('beaver', '海狸'), ('snake', '蛇'), ('mouse', '老鼠'), ('squirrel', '松鼠'), ('kangaroo', '袋鼠'), ('monkey', '猴'), ('panda', '熊猫'), ('bear', '熊'), ('lion', '狮子'), ('tiger', '老虎'), ('fox', '狐狸'), ('zebra', '斑马'), ('deer', '鹿'), ('giraffe', '长颈鹿'), ('goosr', '鹅'), ('hen', '母鸡'), ('turkey', '火鸡'), ('lamb', '小羊'), ('sheep', '绵羊'), ('goat', '山羊'), ('cow', '奶牛'), ('donkey', '驴'), ('squid', '鱿鱼'), ('lobster', '龙虾'), ('shark', '鲨鱼'), ('seal', '海豹')]
>>> 

注:方法二中推导式嵌套,内外层的变量 i 互不干涉(要求版本python3+)。

方法三:先用字典推导式建一个字典,再从字典里遍历出结果

>>> dic={e:CN[i] for i,e in enumerate(EN)}
>>> [cn for en,cn in dic.items() if en.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> #合并成一行:
>>> [cn for en,cn in {e:CN[i] for i,e in enumerate(EN)}.items() if en.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> 
>>> #或者:
>>> [dic[i] for i in dic.keys() if i.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> [dic.get(i) for i in dic.keys() if i.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> #合并成一行:
>>> [{e:CN[i] for i,e in enumerate(EN)}[i] for i in {e:CN[i] for i,e in enumerate(EN)}.keys() if i.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> 
>>> #字典的值:
>>> dic
{'cat': '猫', 'dog': '狗', 'pig': '猪', 'duck': '鸭', 'rabbit': '兔', 'horse': '马', 'elephant': '大象', 'ant': '蚂蚁', 'fish': '鱼', 'bird': '鸟', 'eagle': '鹰', 'beaver': '海狸', 'snake': '蛇', 'mouse': '老鼠', 'squirrel': '松鼠', 'kangaroo': '袋鼠', 'monkey': '猴', 'panda': '熊猫', 'bear': '熊', 'lion': '狮子', 'tiger': '老虎', 'fox': '狐狸', 'zebra': '斑马', 'deer': '鹿', 'giraffe': '长颈鹿', 'goosr': '鹅', 'hen': '母鸡', 'turkey': '火鸡', 'lamb': '小羊', 'sheep': '绵羊', 'goat': '山羊', 'cow': '奶牛', 'donkey': '驴', 'squid': '鱿鱼', 'lobster': '龙虾', 'shark': '鲨鱼', 'seal': '海豹'}

9. 单循环赛对阵表,场数=队数*(队数-1)/2

>>> teams=[chr(i+65) for i in range(6)]
>>> games=[i+'-'+j for i in teams for j in teams if i<j]
>>> teams
['A', 'B', 'C', 'D', 'E', 'F']
>>> games
['A-B', 'A-C', 'A-D', 'A-E', 'A-F', 'B-C', 'B-D', 'B-E', 'B-F', 'C-D', 'C-E', 'C-F', 'D-E', 'D-F', 'E-F']
>>> len(games)
15
>>> 

10. 一行代码找出字符串s中包含多个字母e的单词的中文意思

>>> s='''
cat 猫 dog 狗 pig 猪 duck 鸭 rabbit 兔 horse 马 elephant 大象
ant 蚂蚁 fish 鱼 bird 鸟 eagle 鹰 beaver 海狸 snake 蛇 mouse 老鼠
squirrel 松鼠 kangaroo 袋鼠 monkey 猴 panda 熊猫 bear 熊 lion 狮子
tiger 老虎 fox 狐狸 zebra 斑马 deer 鹿 giraffe 长颈鹿 goosr 鹅
hen 母鸡 turkey 火鸡 lamb 小羊 sheep 绵羊 goat 山羊 cow 奶牛
donkey 驴 squid 鱿鱼 lobster 龙虾 shark 鲨鱼 seal 海豹
'''

>>> [c for e,c in {e:[c for c in s.split() if '\u4e00'<=c<='\u9fff'][c] for c,e in enumerate([c for c in s.split() if not '\u4e00'<=c<='\u9fff'])}.items() if e.count('e')>1]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值