Python文本处理与排序实战:大小写、行列交换及快排实现
本文详解Python文本处理与排序的多种实现方式。涵盖字符串大小写互换的四种内置方法及自定义逻辑;利用列表insert与del实现文件行交换;通过pandas或列表推导式完成矩阵转置。此外,深入解析快速排序的三种Python实现(递归、双指针、算法导论版)及内置sorted()特性,并提供format与just对齐、正则与string模块分行输出的实战代码。
字符串大小写互换的多种实现
在Python中,处理字符串的大小写转换有多种途径。最基础的方式是利用内置函数,如upper()将所有字符转为大写,lower()转为小写,capitalize()仅将首字母大写,以及title()将每个单词的首字母大写。
str = "www.dataCASTLE.com"
print(str.upper())# 把所有字符中的小写字母转换成大写字母
print(str.lower())# 把所有字符中的大写字母转换成小写字母
print(str.capitalize())# 把第一个字母转化为大写字母,其余小写
print(str.title())# 把每个单词的第一个字母转化为大写,其余小写
WWW.DATACASTLE.COM
www.datacastle.com
Www.datacastle.com
Www.Datacastle.Com若需对包含数字和符号的字符串进行大小写互换,内置函数无法直接满足。此时可结合列表推导式与自定义函数实现。通过判断字符是否为小写或大写,分别调用upper()或lower(),非字母字符保持不变,最后使用join()重组字符串。
s="hGdssWW678qqfdDDD777f8888sD8FJJss jjYYhVV #sh&"
def fn(x):
if x.is lower():
return x.upper()
elif x.is upper():
return x.lower()
else:
return x
result=''.join([fn(r) for r in list(s)])
print(result)
HgDSSww678QQFDddd777F8888Sd8fjjSS JJyyHvv #SH&文件行交换与矩阵转置
在处理文本文件时,有时需要交换特定行的位置。可以通过readlines()读取所有行到列表中,利用insert()将某一行插入到目标位置,再使用del()删除原位置的行,从而实现行交换。
with open('D:\n.txt','r') as f:
txt=f.readlines()
txt.insert(4,txt[1])#第二行插入第五行的位置
del(txt[1])#删除原来的第二行
print(txt)
1 A 一
3 C 三
4 D 四
2 B 二
5 E 五
6 F 六对于矩阵数据的行列互换(转置),可以使用列表推导式或pandas库。以下示例展示了如何通过遍历列索引,从原矩阵的每一行中提取对应元素,构建新的转置矩阵。
matrix = [[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],]
trans = []
for i in range(4):
trans.append([row[i] for row in matrix])
print('', trans)
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]]快速排序的三种Python实现
快速排序的核心思想是选取一个基准元素,将序列分为小于和大于基准的两部分,然后递归排序。Python中实现快排有多种风格:
1. 一行代码实现(列表推导式)
利用列表推导式,代码简洁,但空间复杂度较高,适合理解算法逻辑。
def quickSort(arg):
if(arg==[]):
return []
return quickSort([i for i in arg[1:] if i<=arg[0]])+[arg[0]]+quickSort([i for i in arg[1:] if i>arg[0]])
print quickSort([11,22,8,23,7,33,13,28,66,777])
[7, 8, 11, 13, 22, 23, 28, 33, 66, 777]2. 双指针原地排序
通过左右游标low和high向中间逼近,交换元素,实现原地排序,空间复杂度为O(log n)。
def quicksort(array, left, right):
#建立递归终止条件
if left >= right:
return
low = left#low为序列左边要移动的游标
high = right#high为序列右边要移动的游标
key = array[low]#将左边的数设为基准元素
while left < right:
# 当left与right未重合,并且比基准元素要大,就将游标向左移动
while left < right and array[right] > key:
right -= 1
# 如果比基准元素小,就跳出循环,并且把其放在基准元素左边
array[left] = array[right]
# 当low与last未重合,并且比基准元素要小,就将游标向右移动
while left < right and array[left] <= key:
left += 1
# 如果比基准元素大,就跳出循环,并且把其放在基准元素右边
array[right] = array[left]
# 当low与last相等,就是基准元素的排序位置
array[right] = key
# 对排序好的元素左右两边的序列进行递归
quicksort(array, low, left - 1)
quicksort(array, left + 1, high)
array = [11,22,8,23,7,33,13,28,66,777]
print("Quick Sort: ")
quicksort(array,0,len(array)-1)
print(array)
[7, 8, 11, 13, 22, 23, 28, 33, 66, 777]3. 算法导论版快排
参考《算法导论》的实现,通过partition函数划分区间,以最后一个元素为基准,代码结构清晰,适合工程应用。
def quicksort(array, l, r):
if l < r:
q = partition(array, l, r)
quick_sort(array, l, q - 1)
quick_sort(array, q + 1, r)
def partition(array, l, r):
x = array[r]
i = l - 1
for j in range(l, r):
if array[j] <= x:
i += 1
array[i], array[j] = array[j], array[i]
array[i + 1], array[r] = array[r], array[i+1]
return i + 1
array = [11,22,8,23,7,33,13,28,66,777]
print("Quick Sort: ")
quicksort(array,0,len(array)-1)
print(array)
[7, 8, 11, 13, 22, 23, 28, 33, 66, 777]内置排序与文本对齐输出
Python内置的sorted()函数返回一个新的已排序列表,不改变原列表,适用于需要保留原始顺序的场景。它支持数字、字母及符号的混合排序。
a = [11,22,8,23,7,33,13,28,66,777]
b=sorted(a)
print(b)
print(a)
[7, 8, 11, 13, 22, 23, 28, 33, 66, 777]
[11, 22, 8, 23, 7, 33, 13, 28, 66, 777]在文本输出对齐方面,可以使用format()方法指定字段宽度和对齐方式,或使用字符串的ljust()、rjust()等方法进行填充对齐。
# format格式化对齐
def f1():
with open("D:\n.txt","r") as f:
for s in f:
l=s.rsplit ()
#左对齐,填充符号自定
t='{0:<5} {1:<7} {2}'.format(l[0],l[1],l[2])
print(str(t))
f1()
111 ABC 西瓜
22222 AABBC 水蜜桃
3333 CSDDGFF 香蕉
44 QQQSED 波罗蜜#just对齐
r=''
def f2():
f=open("D:\n.txt","r")
for s in f:
l=s.rsplit() #通过指定分隔符对字符串进行切片
print(l[0].ljust(5," "),l[1].ljust(7," "),l[2])
f2()
111 ABC 西瓜
22222 AABBC 水蜜桃
3333 CSDDGFF 香蕉
44 QQQSED 波罗蜜字符串分行输出:正则与String模块
若需将混合字符串按类型(小写、大写、数字、中文等)分行输出,可使用正则表达式或string模块。
使用正则表达式
通过re.compile()编译模式,结合findall()提取匹配内容,最后join()重组。
#正则表达式
a="aA1一bB2二cC3三dD4四eE5五fF6六gG7七hH8八iI9九"
import re
reg=["[a-z]","[A-Z]","d","[^da-zA-Z]"]
#compile和findall一起使用,返回一个列表
for s in reg:
rega=re.compile(s)
s=re.findall(rega,a)
print("".join(s))
abcdefghi
ABCDEFGHI
123456789
一二三四五六七八九使用String模块
利用string.ascii_lowercase、ascii_uppercase和digits预定义字符集,遍历原字符串并分类累加,实现分行输出。
#string方法
a="aA1一bB2二cC3三dD4四eE5五fF6六gG7七hH8八iI9九"
import string
ta=tb=tc=td=''
la=string.ascii_lowercase#la为小写字母
ua=string.ascii_uppercase#ua为大写字母
nb=string.digits#nb为0~9的数字
ub="一二三四五六七八九"
#分别从a中找出小写、大写字母、数字并进行分行输出
for s in a:
if s in la:
ta=ta+s
if s in ua:
tb=tb+s
if s in nb:
tc=tc+s
if s in ub:
td=td+s
print(ta)
print(tb)
print(tc)
print(td)
abcdefghi
ABCDEFGHI
123456789
一二三四五六七八九以上就是Python文本处理与排序实战的详细内容,更多关于Python字符串操作、文件处理及算法实现的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









