Python文本处理与排序实战:大小写、行列交换及快排实现

听雨眠
听雨眠
发布时间:2026-10-11| 2人浏览过
原创

本文详解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字符串操作、文件处理及算法实现的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。