У меня есть список, похожий на следующий:
['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
Я хочу разбить (разделить) и сохранить информацию из списка на основе "\n". Это означает, что я хочу создать следующие строки из приведенного выше списка:
string1='2019, Melbourne, region1, suburb1'
string2='2018, region1, Melbourne'
Я знаю, как это сделать, используя простой цикл и играя по индексам, но мне интересно, может ли кто-нибудь помочь мне выполнить вышеупомянутую задачу более профессионально. Поскольку проигрывание индексов делает мой код немного сложным и нечитаемым.
Вы можете получить список нужных строк, используя 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
возвращает ленивый итератор, создающий одинаково ленивые группы. Таким образом, это не создает лишних промежуточных списков в памяти.
Одним из возможных решений было бы объединение данного списка в строку с помощью join(), а затем использование split для строки для разбивки на список. Ниже приведен код:
test=['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
test_string=",".join(test)
sep_list= test_string.split("\n")
Вы получите список строк, разделенных символом "\n"
','
не тот соединитель, который требуется OP (то есть ', '
). Кроме того, вам придется удалить (убрать) поддельные символы ','
из токенов, возвращенных вашим split
.
Вы можете сделать что-то подобное! используя 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'
Вы можете использовать split()
, но я получаю неожиданный результат, поэтому я использую regex
import re
l = ['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
string1 , string2 = re.findall("(?!,)([^\n]+)(?=,)" ,",".join(l))
print(string1,string2)
,
→ совпадение, но не содержащее результата\n
,
→ совпадением, но не содержит результатаЯ предлагаю решение следующим образом:
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];