Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)


Posted in Python onMarch 20, 2017

通常测试人员或公司实习人员需要处理一些txt文本内容,而此时使用Python是比较方便的语言。它不光在爬取网上资料上方便,还在NLP自然语言处理方面拥有独到的优势。这篇文章主要简单的介绍使用Python处理txt汉字文字、二维列表排序和获取list下标。希望文章对你有所帮助或提供一些见解~

一. list二维数组排序

功能:已经通过Python从维基百科中获取了国家的国土面积和排名信息,此时需要获取国土面积并进行排序判断世界排名是否正确。

Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

列表基础知识

列表类型同字符串一样也是序列式的数据类型,可以通过下标或切片操作来访问某一个或某一块连续的元素。它和字符串不同之处在于:字符串只能由字符组成而且不可变的(不能单独改变它的某个值),而列表是能保留任意数目的Python对象灵活容器。

总之,列表可以包含不同类型的对象(包括用户自定义的对象)作为元素,列表可以添加或删除元素,也可以合并或拆分列表,包括insert、update、remove、sprt、reverse等操作。

列表排序介绍

常用列表排序方法包括使用List内建函数list.sort()或序列类型函数sorted(list)排序

#list.sort(func=None, key=None, reverse=False) 
list = [4, 3, 9, 1, 5, 2] 
print list 
list.sort() 
print list 
#输出 
[4, 3, 9, 1, 5, 2] 
[1, 2, 3, 4, 5, 9]

通过对比下面的代码,可以发现两种方法的区别是:list.sort()改变了原list的顺序,而sorted没有。

#sorted(list) 
list = ['h', 'a', 'p', 'd', 'i', 'b'] 
print list 
print sorted(list) 
print list 
#输出 
['h', 'a', 'p', 'd', 'i', 'b'] 
['a', 'b', 'd', 'h', 'i', 'p'] 
['h', 'a', 'p', 'd', 'i', 'b']

二维列表排序

通过lambda表达式实现二维列表排序,并且按照第二个关键字进行排序。参考文章

#list.sort(func=None, key=None, reverse=False) 
list = [('Tom',4),('Jack',7),('Daly',9),('Mary',1),('God',5),('Yuri',3)] 
print list 
list.sort(lambda x,y:cmp(x[1],y[1])) 
print list 
#输出 
[('Tom', 4), ('Jack', 7), ('Daly', 9), ('Mary', 1), ('God', 5), ('Yuri', 3)] 
[('Mary', 1), ('Yuri', 3), ('Tom', 4), ('God', 5), ('Jack', 7), ('Daly', 9)]

题目中如果第一个数存储文件中读取的行号,第二个数存储人口数量,此时可对第二个数进行排序。需要注意的是它们一组(1,93)是tuple元组。

#list.sort(func=None, key=None, reverse=False) 
list = [(1,93),(2,71),(3,89),(4,93),(5,85),(6,77)] 
print list 
list.sort(key=lambda x:x[1]) 
print list 
#输出 
[(1, 93), (2, 71), (3, 89), (4, 93), (5, 85), (6, 77)] 
[(2, 71), (6, 77), (5, 85), (3, 89), (1, 93), (4, 93)]

lambada表达式

在上述代码中,如果还不知道lambada是什么鬼东西的话?那我就来帮你回顾了。

python允许使用lambda关键字创造匿名函数,它不需要以标准的方式来声明,如def语句。然而作为函数,它们也能有参数。

lambda就是一个表达式,而不是一个代码块。而且这个表达是的定义必须和声明放在同一行,能在lambda中封装有限的逻辑进去,起到一个函数速写的作用。例如:

#lambda [arg1[, arg2, ..., argN]]:expression 
f = lambda x,y,z:x+y+z 
num = f(1,2,3) 
print 'lambda: ' + str(num) 
#等价于 
def add(x,y,z): 
 return x+y+z 
num = add(1,2,3) 
print 'function: ' + str(num) 
#输出 
lambda: 6 
function: 6

二. 处理txt文本

下面是通过txt文件按行读取,并获取面积进行排序。其中核心代码如下:

读取文件&列表添加

source = open("F:\\Student\\1Area.txt",'r') 
lines = source.readlines() 
L = [] #列表二维 国家行数 人口数 
count = 1 #当前国家在文件中第count行 
for line in lines: 
 line = line.rstrip('\n') #去除换行 
 .... #获取排名和面积 
 fNum = string.atof(number) #面积 
 L.append((count,ffNum)) #列表添加 
 count = count + 1 
else: 
 print 'End While' 
 source.close()

列表排序

L.sort(lambda x,y:cmp(x[1],y[1]),reverse = True) 
#遍历过程 表示第i名 (文件第x行,面积y平方公里) 
#重点 L[i]输出列表 1 (46, 17075200.0) L[i][0]表示元组tuple第一个数 1 46 
for i in range(len(L)): 
 print (i+1), L[i]

获取面积字符串

line = line.rstrip('\n') #去除换行 
start = line.find(r'V:') 
end = line.find(r'平方公里') 
number = line[start+2:end] 
number = number.replace(',','') #去除',' 
#输出 
line => C:国家 E:中华人民共和国 A:国土面积 V:9,634,057或9,736,000平方公里(世界第3/4名) 
number => 9634057或9736000

最后同时需要处理各种字符串情况,如‘或'、‘万'要乘10000、删除‘[1]'等。更简单的方法是通过正则表达式或获取第一个非数字字符。

运行结果如下所示,排序后的txt和纠错txt:

Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

代码如下:

# coding=utf-8 
import time 
import re 
import os 
import string 
import sys 
 
source = open("F:\\Student\\1Area.txt",'r') 
lines = source.readlines() 
count = 1 
L = [] #列表二维 国家行数 人口数 
 
''''' 
第一部分 获取国土面积 
''' 
print 'Start!!!' 
for line in lines: 
 line = line.rstrip('\n') #去除换行 
 start = line.find(r'V:') 
 end = line.find(r'平方公里') 
 number = line[start+2:end] 
 number = number.replace(',','') #去除',' 
 fNum = 0.0 
 if '万' in number: 
 end = line.find(r'万') 
 newNum = line[start+2:end] 
 fNum = string.atof(newNum)*10000 
 else: #如何优化代码 全局变量 
 if '/' in number: 
 end = line.find(r'/') 
 newNum = line[start+2:end] 
 newNum = newNum.replace(',','') 
 fNum = string.atof(newNum) 
 elif '(' in number: 
 end = line.find(r'(') 
 newNum = line[start+2:end] 
 newNum = newNum.replace(',','') 
 fNum = string.atof(newNum) 
 elif '[' in number: 
 end = line.find(r'[') 
 newNum = line[start+2:end] 
 newNum = newNum.replace(',','') 
 fNum = string.atof(newNum) 
 elif '或' in number: 
 end = line.find(r'或') 
 newNum = line[start+2:end] 
 newNum = newNum.replace(',','') 
 fNum = string.atof(newNum) 
 elif ' ' in number: 
 end = line.find(r' ') 
 newNum = line[start+2:end] 
 newNum = newNum.replace(',','') 
 fNum = string.atof(newNum) 
 else: 
 fNum = string.atof(number) 
 #print line 
 #print number 
 #print fNum 
 L.append((count,fNum)) 
 count = count + 1 
else: 
 print 'End While' 
 source.close() 
 
''''' 
第二部分 从大到小排序 
参看 http://blog.chinaunix.net/uid-20775448-id-4222915.html 
''' 
L.sort(lambda x,y:cmp(x[1],y[1]),reverse = True) 
#print L 
#遍历过程 表示第i名 (文件第x行,面积y平方公里) 
#重点 L[i]输出列表 1 (46, 17075200.0) L[i][0]表示元组tuple第一个数 1 46 
for i in range(len(L)): 
 print (i+1), L[i] 
 
''''' 
第三部分 读写文件 
''' 
source = open("F:\\Student\\1Area.txt",'r') 
lines = source.readlines() 
result = open("F:\\Student\\1NewArea.txt",'w') 
count = 1 
for line in lines: 
 line = line.rstrip('\n') 
 #获取列表L中排名位置pm 
 pm = 0 
 for i in range(len(L)): 
 if count==L[i][0]: 
 pm = i+1 
 break 
 #获取文件中名次 
 if '世界第' in line: 
 start = line.find(r'世界第') 
 end = line.find(r'名') 
 number = line[start+9:end] 
 if '/' in number: #防止中国第3/4名 
 end = line.find(r'/') 
 number = line[start+9:end] 
 if '包括海外' in number: 
 number = '41' 
 print number,pm,type(number),type(pm) 
 
 if string.atoi(number)==pm: 
 line = line + ' 【排名正确】 【世界第' + str(pm) + '名】' 
 result.write(line+'\n') 
 else: 
 line = line + ' 【排名错误】 【世界第' + str(pm) + '名】' 
 result.write(line+'\n') 
 else: #文件中没有排名 
 line = line + ' 【新加排名】 【世界第' + str(pm) + '名】' 
 result.write(line+'\n') 
 count = count + 1 
else: 
 print 'End Sorted' 
 source.close() 
 result.close() 
 
''''' 
第四部分 输出一个排序好的文件 便于观察 
''' 
source = open("F:\\Student\\1Area.txt",'r') 
lines = source.readlines() 
result = open("F:\\Student\\1NewSortArea.txt",'w') 
#i表示第i名 L[i][0]表示行数 
pm = 0 
for i in range(len(L)): 
 pm = L[i][0] 
 count = 1 
 for line in lines: 
 line = line.rstrip('\n') 
 if count==pm: 
 line = line + ' 【世界第' + str(i+1) + '名】' 
 result.write(line+'\n') 
 break 
 else: 
 count = count + 1 
else: 
 print 'End Sorted Second' 
 source.close() 
 result.close()

最后希望文章对你有所帮助,文章主要通过讲述一个实际操作,帮你巩固学习liet列表的二维排序和字符串txt处理。如果文中有错误或不足之处,还请海涵~

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 Python
python分析网页上所有超链接的方法
May 08 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python可变和不可变、类的私有属性实例分析
May 31 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python mysql断开重连的实现方法
Jul 26 Python
利用Python检测URL状态
Jul 31 Python
django models里数据表插入数据id自增操作
Jul 15 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
python实现简单倒计时功能
Apr 21 Python
Python 专题四 文件基础知识
Mar 20 #Python
python 与GO中操作slice,list的方式实例代码
Mar 20 #Python
Python闭包的两个注意事项(推荐)
Mar 20 #Python
使用python实现生成用户信息
Mar 20 #Python
Unicode和Python的中文处理
Mar 19 #Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 #Python
Python 专题三 字符串的基础知识
Mar 19 #Python
You might like
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
初识laravel5
2015/03/02 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
图片之间的切换
2006/06/26 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
初识Node.js
2015/03/20 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
如何通过命令行进入python
2020/07/06 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
2014年纪检工作总结
2014/11/12 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python