Разделение списка со строками и вложенными списками строк в плоский список - PullRequest
7 голосов
/ 31 марта 2019

Я пишу программу, которая манипулирует строками в файле. Я хочу просто добавить литералы (строки, такие как SUB =X'1D', которые собираются в =X'1D' BYTE X'1D') выше ' LTORG' в мой тестовый файл.

Проблема в том, что я собрал литералы над каждым 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']

Ответы [ 3 ]

1 голос
/ 31 марта 2019

То, что вы пытаетесь сделать, это комбинация двух действий:

  • Во-первых, вам нужно перевести весь список, который находится в строковых литералах, в фактические списки, используя literal_eval из ast модуля.

  • Затем необходимо сгладить список.

Ниже приведен код, демострирующий процесс:

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']
1 голос
/ 31 марта 2019

я бы попробовал использовать что-то вроде верхнего комментария здесь Как сделать плоский список из списка списков?

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)
0 голосов
/ 01 апреля 2019

ОБНОВЛЕНИЕ: Исправлена ​​проблема с циклом 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...