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

简介: 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
['大象', '鹰', '海狸', '鹿', '绵羊']


方法二:

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



两者的区别在于:

>>> [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]
['大象', '鹰', '海狸', '鹿', '绵羊']
>>> 



目录
相关文章
|
6天前
|
存储 索引 Python
Python学习笔记----列表、元组和字典的基础操作
这篇文章是一份Python学习笔记,涵盖了列表、元组和字典的基础操作,包括它们的创建、修改、删除、内置函数和方法等。
Python学习笔记----列表、元组和字典的基础操作
|
16天前
|
程序员 开发者 Python
探索Python中的推导式-推导式的使用
【8月更文挑战第3天】
30 13
|
7天前
|
索引 Python
Day 7/100:Python列表
Day 7/100:Python列表
9 1
|
13天前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
15 7
|
10天前
|
存储 数据库 C++
"深入剖析Python元组(tuple):与列表的对比、特性解析及高效应用场景展示"
【8月更文挑战第9天】Python元组与列表虽均用于存储元素集合,但有本质差异。元组不可变,创建后无法修改,适合保护数据不被意外更改的场景,如作字典键或传递固定值。列表则可变,支持动态增删改,适用于需频繁调整的数据集。元组因不可变性而在性能上有优势,可用于快速查找。两者各有千秋,根据具体需求选择使用。例如,元组可用于表示坐标点或日期,而列表更适合管理用户列表或库存。
16 1
|
19天前
|
Python
探索Python中的列表推导式:从基础到高级应用
【7月更文挑战第31天】在Python编程的多彩世界中,列表推导式以其简洁和高效著称。本文将带领读者从零开始,深入理解列表推导式的工作原理,并通过实际代码示例展示如何利用它解决日常编程问题。我们还将探讨一些高级用法,比如嵌套推导式和生成器表达式,以及它们如何优化性能和简化代码。最后,文章将以思考题结束,鼓励读者将所学应用于更广泛的场景中。
16 5
|
18天前
|
测试技术 数据处理 开发者
探索Python中的列表推导式:简洁与效率的融合
【8月更文挑战第2天】在Python编程世界中,列表推导式以其简明扼要的语法和高效的性能而备受青睐。本文将通过实际代码示例深入探讨列表推导式的使用场景、优势及其背后的工作原理。我们将一起见证如何通过几行简单的代码,完成复杂的数据处理任务,并评估其在不同情况下的性能表现。
|
20天前
|
存储 缓存 测试技术
Python列表与元组
【7月更文挑战第26天】Python 中的列表(List)和元组(Tuple)是两种常用的数据结构,它们都可以用来存储一系列的元素。虽然它们在某些方面相似,但也有一些重要的区别。在本文中,我们将分享一些 Python 中列表和元组的操作技巧,帮助您更好地理解它们的用法和特性。
21 4
|
1月前
|
索引 Python
Python的列表操作有哪些?
Python的列表操作非常丰富,包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。
31 12
|
4天前
|
存储 数据安全/隐私保护 索引
Python基础语法day02字符串详解和列表
Python基础语法day02字符串详解和列表