【问题标题】:Splitting a list with strings and nested lists of strings into a flat list将带有字符串的列表和嵌套的字符串列表拆分为平面列表
【发布时间】:2019-08-21 15:37:39
【问题描述】:

我正在编写一个操作文件中字符串的程序。我想简单地将' LTORG' 上方的文字(字符串,例如组合成=X'1D' BYTE X'1D'SUB =X'1D')添加到我的测试文件中。

问题是我将每个 LTORG 上方的文字收集为一个列表,并将它们作为一个列表插入。我想一次插入一个文字。

我的输出是:

[' START 100', " SUB =X'1D'", ' LTORG', '["=X\'1D\' BYTE X\'1D\'"]', ' RESW 
   20', " SUB =X'0259'", " ADD =C'12345'", " MUL =X'4356'", " SUB =X'69'", ' 
   LTORG', '["=X\'0259\' BYTE X\'0259\'", "=C\'12345\' BYTE C\'12345\'", 
   "=X\'4356\' BYTE X\'4356\'", "=X\'69\' BYTE X\'69\'"]', " ADD =C'05'", ' 
   END EXA']
def handle_LTORG(self, testfile):

    myfile.testfile = testfile

    for index, line in enumerate(myfile.testfile):
        line = line.split(" ", 3)
        if len(line) > 2:
            if line[2].startswith("=X") or line[2].startswith("=C"):
                raw_literal = line[2]
                instruction = 'BYTE'
                operand = line[2][1:]
                literal = [raw_literal, instruction, operand]
                literal = ' '.join(literal)
                myfile.literals.append(literal)
        if line[1] == 'LTORG':
            if myfile.literals is not None:
                myfile.testfile.insert(index + 1, str(myfile.literals))
                myfile.literals.pop(0)

倒数第二行主要是产生问题。它将收集到的文字添加到一个列表中,并将它们作为一个打包列表插入,而不是每行一个字符串。

我希望它看起来像这样:

[' START 100', " SUB =X'1D'", ' LTORG', '"=X'1D' BYTE X'1D'"', ' RESW 20', " SUB =X'0259'", " ADD =C'12345'", " MUL =X'4356'", " SUB =X'69'", ' LTORG', '"=X'0259' BYTE X'0259'", "=C'12345' BYTE C'12345'", "=X'4356' BYTE X'4356'", "=X'69' BYTE X'69'", " ADD =C'05'", ' END EXA']

【问题讨论】:

  • testfile的类型是什么? (因此,myfile.testfile?)
  • 另外,为什么不用if myfile.literals: 而不是if myfile.literals is not None:

标签: python python-3.x string list


【解决方案1】:

我会尝试在这里使用顶级评论How to make a flat list out of list of lists?

list = ['whatever',['1','2','3'],'3er']
flat_list = []
for member in list:
    if type(member) is list:
        for item in member:
            flat_list.append(item)
    else:
        flat_list.append(member)

【讨论】:

  • 这并不能解决我遇到的两个问题。我不想要一个纯粹的平面列表,我需要它就像输出一样
【解决方案2】:

你想要做的是两个动作的组合:

  • 首先,您需要将字符串文字中的所有列表转换为 使用来自ast 模块的literal_eval 的实际列表。

  • 然后,您需要展平列表。

以下是演示该过程的代码:

from ast import literal_eval
inlist = [' START 100', " SUB =X'1D'", ' LTORG', '["=X\'1D\' BYTE X\'1D\'"]', ' RESW    20', " SUB =X'0259'", " ADD =C'12345'", " MUL =X'4356'", " SUB =X'69'", '    LTORG', '["=X\'0259\' BYTE X\'0259\'", "=C\'12345\' BYTE C\'12345\'",    "=X\'4356\' BYTE X\'4356\'", "=X\'69\' BYTE X\'69\'"]', " ADD =C'05'", '    END EXA']
inlist = [literal_eval(elem) if elem[0] == '[' and elem[-1] == ']' else elem for elem in inlist]
outlist = []
for elem in inlist:
     if isinstance(elem,list):
          for item in elem:
               outlist.append(item)
     else:
          outlist.append(elem)
print(outlist)

输出:

[' START 100', " SUB =X'1D'", ' LTORG', "=X'1D' BYTE X'1D'", ' RESW    20', " SUB =X'0259'", " ADD =C'12345'", " MUL =X'4356'", " SUB =X'69'", '    LTORG', "=X'0259' BYTE X'0259'", "=C'12345' BYTE C'12345'", "=X'4356' BYTE X'4356'", "=X'69' BYTE X'69'", " ADD =C'05'", '    END EXA']

【讨论】:

  • 第二个 ‘LTORG’ 之后的其他两个字面量发生了什么变化?我需要它们作为单独的常用分隔字符串
  • @A.Sultan 编辑了我的答案。现在它应该返回正确的结果。
【解决方案3】:

更新:修复了 while 循环的问题。欢迎发表建议!

    def handle_LTORG(self, testfile):

    myfile.testfile = testfile

    for index, line in enumerate(myfile.testfile):
        line = line.split(" ", 3)
        if len(line) > 2:
            if line[2].startswith("=X") or line[2].startswith("=C"):
                raw_literal = line[2]
                instruction = 'BYTE'
                operand = line[2][1:]
                literal = [raw_literal, instruction, operand]
                literal = ' '.join(literal)
                myfile.literals.append(literal)
        if line[1] == 'LTORG':
            if myfile.literals:
                i = 'hi'
                while len(i) > 0:
                    i = myfile.literals[-1]
                    myfile.testfile.insert(index+1, str(i))
                    myfile.literals.pop()
                    if len(myfile.literals) == 0:
                        break

    return myfile.testfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多