- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
通常测试人员或公司实习人员需要处理一些txt文本内容,而此时使用Python是比较方便的语言。它不光在爬取网上资料上方便,还在NLP自然语言处理方面拥有独到的优势。这篇文章主要简单的介绍使用Python处理txt汉字文字、二维列表排序和获取list下标。希望文章对你有所帮助或提供一些见解~ 。
一. list二维数组排序 。
功能:已经通过Python从维基百科中获取了国家的国土面积和排名信息,此时需要获取国土面积并进行排序判断世界排名是否正确.
列表基础知识 。
列表类型同字符串一样也是序列式的数据类型,可以通过下标或切片操作来访问某一个或某一块连续的元素。它和字符串不同之处在于:字符串只能由字符组成而且不可变的(不能单独改变它的某个值),而列表是能保留任意数目的Python对象灵活容器.
总之,列表可以包含不同类型的对象(包括用户自定义的对象)作为元素,列表可以添加或删除元素,也可以合并或拆分列表,包括insert、update、remove、sprt、reverse等操作.
列表排序介绍 。
常用列表排序方法包括使用List内建函数list.sort()或序列类型函数sorted(list)排序 。
1
2
3
4
5
6
7
8
|
#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没有.
1
2
3
4
5
6
7
8
9
|
#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表达式实现二维列表排序,并且按照第二个关键字进行排序。参考文章 。
1
2
3
4
5
6
7
8
|
#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元组.
1
2
3
4
5
6
7
8
|
#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中封装有限的逻辑进去,起到一个函数速写的作用。例如:
1
2
3
4
5
6
7
8
9
10
11
12
|
#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文件按行读取,并获取面积进行排序。其中核心代码如下:
读取文件&列表添加 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
source
=
open
(
"F:\Student\1Area.txt"
,
'r'
)
lines
=
source.readlines()
L
=
[]
#列表二维 国家行数 人口数
count
=
1
#当前国家在文件中第count行
for
line
in
lines:
line
=
line.rstrip(
' '
)
#去除换行
....
#获取排名和面积
fNum
=
string.atof(number)
#面积
L.append((count,ffNum))
#列表添加
count
=
count
+
1
else
:
print
'End While'
source.close()
|
列表排序 。
1
2
3
4
5
|
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]
|
获取面积字符串 。
1
2
3
4
5
6
7
8
|
line
=
line.rstrip(
' '
)
#去除换行
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:
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# 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(
' '
)
#去除换行
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(
' '
)
#获取列表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
+
' '
)
else
:
line
=
line
+
' 【排名错误】 【世界第'
+
str
(pm)
+
'名】'
result.write(line
+
' '
)
else
:
#文件中没有排名
line
=
line
+
' 【新加排名】 【世界第'
+
str
(pm)
+
'名】'
result.write(line
+
' '
)
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(
' '
)
if
count
=
=
pm:
line
=
line
+
' 【世界第'
+
str
(i
+
1
)
+
'名】'
result.write(line
+
' '
)
break
else
:
count
=
count
+
1
else
:
print
'End Sorted Second'
source.close()
result.close()
|
最后希望文章对你有所帮助,文章主要通过讲述一个实际操作,帮你巩固学习liet列表的二维排序和字符串txt处理。如果文中有错误或不足之处,还请海涵~ 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://blog.csdn.net/eastmount/article/details/48470577 。
最后此篇关于Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)的文章就讲到这里了,如果你想了解更多关于Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否可以创建一个可以使用显式参数标签调用的下标? struct MyType { subscript (label: Bool) -> String? { return nil
我正在尝试制作一个包含带有上标和/或下标的文本的超链接。我找到了两种方法来做到这一点,它们都很糟糕。 解决方案#1:使用 Typography.Variants .这为某些字体提供了极好的上标……。
在这里! 我想在 geom_bracket 中包含一个带下标的标签在 ggplot2 .我尝试了不同的方式,但没有人成功(评论中的尝试): library(ggplot2) ggplot(data =
我正在尝试让 graphviz 启动并工作,我迫切需要节点标签中的下标。不幸的是,通过浏览无数关于类似问题的帖子,我似乎适合所有建议的解决方案,但仍然不起作用。这是我的代码: digraph G{
抱歉格式问题,我从来没有真正在这样的论坛上发帖,所以我必须学习一下操作方法。 我的问题是:我正在编写一个模板类,我想通过多种 [] 运算符访问我的容器。我读了一些关于这个主题的内容,所以我已经能够重载
我知道我们可以像在 matplotlib 中生成单个下标 $r_i$ 会给我一个下标为“i”的r。 但我想生成一个包含 3 或 4 个字母的下标,例如 r_ijk 应该给我一个带有“ijk”作为下标的
this[5] 有什么作用?我是否调用了某种未定义的行为?关于: std::vector foo{this, this + 5u}; 这个有用吗?我想知道指针算法对 this 的影响是什么。这是一个测
我从 visual studio 得到了一些奇怪的行为,关于以下代码片段,错误列表显示了 E0349 的几个实例:没有运算符“[]”匹配这些操作数。 Intellisense 似乎暗示类型不匹配,但正
我想为我的数组类提供 PHP 样式的 push_back 功能: arrayT arr; arr[] = 10; // == std::vector::push_back() 和 arrayT::op
下标 (subscripts)可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)
我正在使用traindata训练svm。 (R中的e1071软件包)。以下是有关我的数据的信息。 > str(train) 'data.frame': 891 obs. of 10 variab
#include int main(){ int arr[7] = {0,1,2,3,4,3,2}; arr[0]++[arr]++[arr]++[arr]++[arr]++[arr]
如果我想以特定用户的身份调用主脚本文件中的另一个 shell 脚本,我该怎么做呢?子脚本似乎失去了它正在运行的用户的上下文,我还没有找到任何有用的子脚本技术。 例如:war-install.sh if
这个问题在这里已经有了答案: Why isn't there an operator[] for a std::list? (4 个答案) 关闭 5 年前。 我有这些类型定义: typedef pa
我在 NSUserdefaults 中获取字典的字符串时遇到问题,这是我的代码。我不知道似乎是什么问题: static func getItemInUserDefaultsDictionary(key
我正在尝试执行以下代码并收到错误 Could not find member 'subscript on Xcode6 var b:[[Float]] = [[1,2]] var i2 = 0 //
我尝试运行的代码: std::string genBlankName(std::vector &posts) { std::string baseName = "New Post ";
1 1 A_{3} 2 2 C_{2} 3 3 ^{5}C_{1} 我有一个这样的输入文件要绘制。第三列是该点上的标签( latex 格式)。我如何在绘图上显示这些标签,就像它们在 latex 编译后
我在这里搜索了一段时间,之前的问题/答案部分回答了我的问题。我正在学习 R,来自 Matlab。正如标题所说,我有一个关于情节注释的问题。在 Matlab 中,绘制包含各种数据格式的注释非常简单,我正
我想将一些化学数据放入表格的列中。但在现有表格中,下标显示为普通字符。其中一些显示为问号。我应该怎么做才能解决它? 当我输入这段代码时 SELECT N'H' + NCHAR(0x2082) + N
我是一名优秀的程序员,十分优秀!