Можно ли перебирать элементы в списке и возвращать фрагменты списка на основе повторяющихся символов?

У меня есть данные, хранящиеся в списке, который следует шаблону. Данные поступают из чтения файла построчно и добавления определенных строк в список. Когда я печатаю список, данные следуют порядку, и это здорово.

Могу ли я прочитать этот список, чтобы выбрать фрагменты данных?

Например, если у меня есть в списке:

['|CODE|', 'name', 'group', 'info', '|CODE_1|', 'name', 'group', 'info',] и так далее...

Возможно ли вернуть строки между |CODE| части?

Кроме того, строки между каждым |CODE| строка может быть разной длины, т.е. между ними может быть 4 строки или 6 или 10 или 1 и т.д.

Дайте мне знать, если я могу как-то изменить свой вопрос :)

У меня еще нет кода, так как я не знал, как решить эту проблему.

такие значения, как |CODE_1|, буквально входят в ваш список?

RomanPerekhrest 10.02.2023 15:42

Поскольку вопрос «возможно ли это?», то ответ «да».

Scott Hunter 10.02.2023 15:47

Поскольку вопрос «возможно ли это?», то ответ «да».

Scott Hunter 10.02.2023 15:47

Я могу добавить начальный элемент таким образом, чтобы он содержал символ | ... | да

Jack 10.02.2023 16:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

yourlist[yourlist.index('|CODE|')+1:yourlist.index('|CODE_1|')]

list.index получает индекс нужных вам строк. Остальное - это просто срез, чтобы нарезать этот список между желаемыми индексами.

Ответ принят как подходящий

Вам необходимо выполнить несколько шагов:

  1. Создайте окончательный список, который вам нужен,
  2. Перебрать список после того, как первый элемент будет '|CODE|',
  3. Добавить элемент в текущий фрагмент данных,
  4. Если вы обнаружите новый фрагмент, сохраните текущий фрагмент и создайте новый.
lst = ["|CODE|", "name", "group", "info", "|CODE_1|", "name", "group", "info"]

chunk = []
chunks = []
for e in lst[lst.index("|CODE|") + 1 :]:
    if e.startswith("|CODE"):
        chunks.append(chunk)
        chunk = []
    else:
        chunk.append(e)
if chunk:
    chunks.append(chunk)
print(chunks)
# [['name', 'group', 'info'], ['name', 'group', 'info']]

Если вам нужно включить строку, которая запускает фрагмент:

chunk = ["|CODE|"]  # start chunk with first marker
...
        chunk = [e]  # each chunk start with the marker
# [['|CODE|', 'name', 'group', 'info'], ['|CODE_1|', 'name', 'group', 'info']]

Результат:

lst = ["|CODE|", "name", "group", "info", "|CODE_1|", "name", "group", "info", "|CODE_2|", "name", "group", "info", "|CODE_3|", "name", "group", "info"]

chunks = []
chunk = ["|CODE|"]
for e in lst[lst.index("|CODE|") + 1 :]:
    if e.startswith("|CODE"):
        chunks.append(chunk)
        chunk = [e]
    else:
        chunk.append(e)
if chunk:
    chunks.append(chunk)
print(chunks)
# [['|CODE|', 'name', 'group', 'info'], ['|CODE_1|', 'name', 'group', 'info'], ['|CODE_2|', 'name', 'group', 'info'], ['|CODE_3|', 'name', 'group', 'info']]

Как запустить такого рода алгоритмы.

Вам нужно действовать шаг за шагом.

  1. Вы знаете, что вам нужно перебрать список, поэтому выполните цикл for,

  2. Вам нужен список chunks, это легко сделать, создайте пустой список перед циклом. Это ваша окончательная структура данных, которую вы хотите заполнить,

  3. Вы хотите, чтобы короткие chunk данных хранились внутри chunks:

    1. Инициализируйте его пустым перед циклом,
    2. Добавьте код, чтобы добавить chunk внутри chunks.
    3. Когда нужно добавить chunk? При обнаружении «маркера нового фрагмента» стартовая строка "|CODE". Сделайте если.
    4. И сбросьте chunk в пустой список, теперь вы начинаете новый chunk,
  4. Что делать, если не обнаружить новый chunk? Добавьте значение к текущему chunk,

Каждый шаг прост сам по себе, но весь процесс может показаться ошеломляющим. Когда вы не знаете, с чего начать, разделите задачу на мелкие, разделите сложность. И не стесняйтесь разделять, если шаг кажется слишком сложным, чтобы его было легко сделать. Когда вы продвигаетесь в написании алгоритма, попробуйте проверить свои шаги, запустив свой код, и убедитесь, что результат вашей текущей работы соответствует вашим ожиданиям.

Привет еще раз! этот код, похоже, работал, но возвращает только последний маркер кода в последнем и последующих строках. есть несколько маркеров кода заранее.

Jack 14.02.2023 17:44

@ Джек Чего не хватает? Можете ли вы привести пример?

Dorian Turba 14.02.2023 17:46

"|КОД|", "имя", "группа", "информация", "|КОД_1|", "имя", "группа", "информация", "|КОД_2|", "имя", "группа", "info", "|CODE_3|", "name", "group", "info", поэтому для примера здесь код будет возвращаться только из CODE_3 и далее, а не другие "фрагменты"

Jack 14.02.2023 17:51

Я обновил свой ответ, чтобы показать вам возвращаемое значение с вашим вводом, пожалуйста, покажите мне, что не так.

Dorian Turba 14.02.2023 17:54

Я не знаю, что вам сказать, кроме того, что он возвращает только последний кусок, а не другие. это может быть что-то еще в моем коде, которое еще больше мешает, поэтому придется устранять неполадки

Jack 14.02.2023 18:09
отредактируйте свой вопрос, чтобы добавить свой код и результат. Если это не работает для вас, вы, вероятно, что-то изменили где-то.
Dorian Turba 14.02.2023 18:10

Мне удалось исправить проблему, это мешал другой код! Спасибо за помощь

Jack 14.02.2023 18:31

Итак, код в ответе работает для вашей проблемы?

Dorian Turba 14.02.2023 18:32

Другие вопросы по теме