Python 如何基于列表项断开列表并创建相关字符串

Python 如何基于列表项断开列表并创建相关字符串,python,list,split,Python,List,Split,我有一个类似于以下列表的列表: ['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n'] 我想根据“\n”中断(拆分)并存储列表的信息。这意味着我想从上面的列表中创建以下字符串: string1='2019, Melbourne, region1, suburb1' string2='2018, region1, Melbourne' 我知道如何使用一个简单的for循环和围绕索引进行操作,

我有一个类似于以下列表的列表:

['2019','Melbourne','region1','suburb1','\n', '2018','region1','Melbourne','\n']
我想根据“\n”中断(拆分)并存储列表的信息。这意味着我想从上面的列表中创建以下字符串:

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

我知道如何使用一个简单的for循环和围绕索引进行操作,但我想知道是否有人能以更专业的方式帮助我完成上述任务。因为绕过索引会使我的代码有点复杂和不可读。

您可以获得所需字符串的列表,使用适当的键函数将列表分块并将分块转换为字符串:

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
返回一个惰性迭代器,生成同样惰性的组。因此,这不会在内存中生成任何不必要的中间列表。

您可以获得所需字符串的列表,使用适当的键函数将列表分块并将分块转换为字符串:

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
返回一个惰性迭代器,生成同样惰性的组。因此,这不会在内存列表中构建任何不必要的中间层。

您可以这样做!使用
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'

你可以这样做!使用
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'

我建议这样的解决方案:

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];

我建议这样的解决方案:

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];

一种可能的解决方案是使用join()将给定列表连接成一个字符串,然后对该字符串使用split将其拆分为列表。代码如下:

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

sep_list= test_string.split("\n")

您将得到一个由“\n”

分隔的字符串列表。一个可能的解决方案是使用join()将给定列表连接成一个字符串,然后对字符串使用split将其拆分为列表。代码如下:

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

sep_list= test_string.split("\n")
您将得到一个由“\n”

分隔的字符串列表。您可以使用
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]+):匹配str直到
    \n
  • (?=,):匹配以
    结尾的str,
    ->匹配但不包含在结果中
  • 您可以使用
    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]+):匹配str直到
    \n
  • (?=,):匹配以
    结尾的str,
    ->匹配但不包含在结果中

  • 将其转换为字符串,然后相应地拆分。@AkshayNevrekar这就像是拿一个几乎完整的拼图,将其混合,然后重新开始。将其转换为字符串,然后相应地拆分。@AkshayNevrekar这就像拿一个几乎完整的拼图,将其混合,然后重新开始。“我知道如何使用simple for loop和Play around Index来实现这一点,但我[想要]一种更专业的方式。”“我知道如何使用simple for loop和Play around Index来实现这一点,但我[想要]一种更专业的方式。”
    ,“
    不是OP想要的连接器(即
    ,”
    )。此外,您还必须移除(剥离)你的
    拆分返回的令牌中有虚假的
    。你说得对。我刚刚运行了代码并注意到了额外的“,”。感谢你指出!
    ,“
    不是OP想要的连接器(即
    ,”
    )。此外,你还必须移除(剥离)伪
    ,“
    来自您的
    拆分返回的令牌。你说得对。我刚刚运行了代码并注意到了额外的“,”。感谢您指出!