【问题标题】:How to break a list based on list item and create relevant strings [duplicate]如何根据列表项打破列表并创建相关字符串[重复]
【发布时间】:2018-09-24 06:58:05
【问题描述】:

我有一个类似下面的列表:

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

我想打破(拆分)并存储基于'\n'的列表信息。这意味着我想从上面的列表中创建以下字符串:

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

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

【问题讨论】:

  • 将其转换为字符串,然后进行相应的拆分。
  • @AkshayNevrekar 这就像把一个几乎完整的谜题混合起来,然后重新开始。

标签: python list split


【解决方案1】:

您可以获得所需字符串的列表,使用带有适当键功能的itertools.groupby 将列表分块,使用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 返回一个惰性迭代器,产生同样惰性的组。所以这不会构建任何不必要的中间内存列表。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      一种可能的解决方案是使用 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 返回的令牌中删除(去除)虚假的','
      • 你是对的。我刚刚运行代码并注意到额外的','。感谢您指出!
      【解决方案4】:

      你可以使用split(),但是我得到了一个意想不到的结果,所以我使用了正则表达式

      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. (?=,) : 匹配以, 结尾的str -> 匹配但不包含在结果中

      【讨论】:

        【解决方案5】:

        我提出这样的解决方案:

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

        【讨论】:

        • “我知道如何使用简单的 for 循环和使用索引来做到这一点,但我 [想要] 一种更专业的方式。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多