Skip to main content
 首页 » 编程设计

python之如何使用 Python 对同名数组进行分组

2025年05月04日62mate10pro

我在一个文本文件中有超过一千个数组类别,例如:

Category A1 和 Cateogry A2:(matlab 代码中的数组)

A1={[2,1,2]}; 
A1={[4,2,1,2,3]}; 
A2={[3,3,2,1]}; 
A2={[4,4,2,2]}; 
A2={[2,2,1,1,1]}; 

我想使用 Python 来帮助我读取文件并将它们分组为:

A1=[{[2,1,2]} {[4,2,1,2,3]}];   
A2=[{[3,3,2,1]} {[4,4,2,2]} {[2,2,1,1,1]}]; 

请您参考如下方法:

使用字典进行分组,我猜你的意思是分组为字符串,因为它们不是来自 .mat matlab 文件的有效 python 容器:

from collections import OrderedDict 
od = OrderedDict() 
with open("infile") as f: 
    for line in f: 
        name, data = line.split("=") 
        od.setdefault(name,[]).append(data.rstrip(";\n")) 
 
from pprint import pprint as pp 
pp((od.values())) 
[['{[2,1,2]}', '{[4,2,1,2,3]}'], 
['{[3,3,2,1]}', '{[4,4,2,2]}', '{[2,2,1,1,1]}']] 

要对文件中的数据进行分组,只需编写内容:

with open("infile", "w") as f: 
    for k, v in od.items(): 
        f.write("{}=[{}];\n".format(k, " ".join(v)))) 

输出:

A1=[{[2,1,2]} {[4,2,1,2,3]}]; 
A2=[{[3,3,2,1]} {[4,4,2,2]} {[2,2,1,1,1]}]; 

这实际上是您想要的输出,其中从每个子数组中删除了分号,将元素分组并将分号添加到组的末尾以保持数据在您的 matlab 文件中有效。

collections.OrderedDict将保留原始文件中的顺序,使用普通字典将没有顺序。

更新文件时更安全的方法是写入临时文件,然后使用 NamedTemporaryFile 将原始文件替换为更新的文件和 shutil.move :

from collections import OrderedDict 
 
od = OrderedDict() 
from tempfile import NamedTemporaryFile 
from shutil import move 
 
with open("infile") as f, NamedTemporaryFile(dir=".", delete=False) as temp: 
    for line in f: 
        name, data = line.split("=") 
        od.setdefault(name, []).append(data.rstrip("\n;")) 
    for k, v in od.items(): 
        temp.write("{}=[{}];\n".format(k, " ".join(v))) 
move(temp.name, "infile") 

如果代码在循环中出错或您的组件在写入过程中崩溃,您的原始文件将被保留。