Как разбить список на основе элемента списка и создать соответствующие строки [дубликаты]

1

У меня есть список, похожий на следующий:

['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']

Я хочу разбить (разделить) и сохранить информацию из списка на основе "\n". Это означает, что я хочу создать следующие строки из приведенного выше списка:

string1='2019, Melbourne, region1, suburb1'
string2='2018, region1, Melbourne'

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

  • 0
    преобразовать его в строку, а затем разделить его соответственно.
  • 0
    @AkshayNevrekar Это все равно что взять почти полную загадку, перепутать ее и начать все заново.
Теги:
list
split

5 ответов

4

Вы можете получить список нужных строк, используя itertools.groupby с соответствующей ключевой функцией, чтобы str.join список и str.join чтобы превратить куски в строки:

from itertools import groupby

l = ['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']

[', '.join(g) for k, g in groupby(l, key=lambda s: s != '\n') if k]
# ['2019, Melbourne, region1, suburb1', '2018, region1, Melbourne']

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

1

Одним из возможных решений было бы объединение данного списка в строку с помощью join(), а затем использование split для строки для разбивки на список. Ниже приведен код:

test=['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
test_string=",".join(test)

sep_list= test_string.split("\n")

Вы получите список строк, разделенных символом "\n"

  • 0
    ',' не тот соединитель, который требуется OP (то есть ', ' ). Кроме того, вам придется удалить (убрать) поддельные символы ',' из токенов, возвращенных вашим split .
  • 0
    Вы правы. Я просто запустил код и заметил дополнительный ','. Спасибо за указание на это!
1

Вы можете сделать что-то подобное! используя re

import re
l = ['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
res = re.split("[\r\n]+",' '.join(l))[:-1]
string1 = res[0].strip().replace(' ',', ')
string2 = res[1].strip().replace(' ',', ')

# string1 --> '2019, Melbourne, region1, suburb1'
# string2 --> '2018, region1, Melbourne'
1

Вы можете использовать split(), но я получаю неожиданный результат, поэтому я использую regex

import re
l = ['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
string1 , string2 = re.findall("(?!,)([^\n]+)(?=,)" ,",".join(l))
print(string1,string2)
  1. (?!,): использовать для соответствия строке началось без , → совпадение, но не содержащее результата
  2. ([^\n] +): сопоставить str до \n
  3. (? =,): match str, который заканчивается с , → совпадением, но не содержит результата
0

Я предлагаю решение следующим образом:

listin=['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n'];
listsout=[];sublist=[];
for val in listin:
    if val.__contains__('\n')==False:
        sublist.append(val);
    else:
        listsout.append([i for i in sublist]);
        sublist = [];
# --------------------------------------------
strings = [', '.join(sublist) for sublist in listsout];
  • 0
    «Я знаю, как это сделать, используя простой цикл и играть с индексами, но я хочу более профессиональный подход».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню