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

标签 python arrays list file python-2.7

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

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")

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

关于python - 如何使用 Python 对同名数组进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30556404/

相关文章:

python - Str 替换方法就地发生

c - 按升序将一维数组输入二维数组 (C)

javascript - Knockout 可观察数组不会重新呈现我的列表

java - 如何添加 java.util.Scanner 类来读取浮点条目输入的二维数组?

java - 制作可添加到非索引位置的列表的最佳方法是什么

c# - 使用具有不同类型/类列表的通用方法

Python-从自动开始下载的链接保存pdf

python - cmake、swig 和 python : How to override conflicting symbols

python - 分发 python 应用程序

c - 在确定数组大小时,括号是否有所不同?