【问题标题】:How to make list including certain multi-bit letters by using Python?如何使用 Python 制作包含某些多位字母的列表?
【发布时间】:2021-07-01 07:08:20
【问题描述】:

我正在尝试使用 Python 列出某些单词。

这是文本文件(输入文件):(“random_text”是文本文件中存在的随机文本)

random_text

reg A1_M0;
reg A1_M1;
reg A1_M10;
reg A1_M11;
reg A1_M2;

reg [3:0] B1_M0;
reg [3:0] B1_M1;
reg [3:0] B1_M10;
reg [3:0] B1_M11;
reg [3:0] B1_M2;

random_text

我想通过提取行和拆分数据来制作以下两个列表。

list1 = [A1_M0, A1_M1, A1_M10, A1_M11, A1_M2]

list2 = [B1_M0[3], B1_M0[2], B1_M0[1], B1_M0[0], B1_M1[3], B1_M1[2], ... , B1_M2[1], B1_M2[0]]

我想了三个步骤:

  1. 提取目标数据(通过使用'.findall') -> A1_M0, A1_M1, A1_M10, A1_M11, A1_M2, B1_M0[3:0], B1_M1[3:0], B1_M10[3:0], B1_M11[3 :0], B1_M2[3:0]

  2. 如果是 4 位数据,则​​将所有这些数据拆分为 1 位数据。

  3. 把它们做成2种列表(list1,list2)

我已经尝试过'.readlines' 方法,但我很难实现。我该如何处理?

【问题讨论】:

    标签: python arrays python-3.x list readline


    【解决方案1】:

    我做了一些我希望是正确的假设。

    1. 我按前缀将所有位组合在一起,因为这似乎是list1list2 中的位之间的共同点
    2. 您的随机文本和有意义的数据之间的区别在于前缀“reg”的存在
    3. “reg”前缀行只有2种,区别在于是否存在“[”字符,如果有比这更细微的定义,可以修改条件。
    def get_reg_lines(f):
        for line in f.readlines():
            if "reg " in line:
                yield line.removeprefix('reg ').removesuffix(';\n')
    
    
    def handle_single(d, line):
        k, _ = line.split("_", 1)
        d.setdefault(k, []).append(line)
    
    
    def handle_multi(d, line):
        r, b = line.split(" ", 1)
        k, _ = b.split("_", 1)
    
        start, end = [int(v) for v in r[1:-1].split(":")]
        d.setdefault(k, []).extend([f'{b}[{i}]' for i in range(start, end - 1, -1)])
    
    
    def main():
        d = {}
        with open('input.txt', 'r') as f:
            for line in get_reg_lines(f):
                if "[" in line:
                    handle_multi(d, line)
                else:
                    handle_single(d, line)
        print(d)
    
    
    if __name__ == '__main__':
        main()
    

    我将它们放在dict d 中,并使用前缀A1B1。如果这是您与数据交互的首选方式,您可以将它们解压缩到您需要的任何列表中。

    另请注意:我使用了需要 Python3.9 或更高版本的 removeprefixremovesuffix,之前的版本用切片表示法替换。

    yield line[4:-2]
    

    *在 input.txt 上测试了代码,内容如下:

    random_text
    
    reg A1_M0;
    reg A1_M1;
    reg A1_M10;
    reg A1_M11;
    reg A1_M2;
    
    reg [3:0] B1_M0;
    reg [3:0] B1_M1;
    reg [3:0] B1_M10;
    reg [3:0] B1_M11;
    reg [3:0] B1_M2;
    
    random_text
    

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2020-11-11
      • 2021-07-30
      • 2020-06-11
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多