【问题标题】:Splitting lists by empty element按空元素拆分列表
【发布时间】:2018-10-23 07:36:44
【问题描述】:

我有一个可以包含任意数量元素的列表。

['jeff','ham','boat','','my','name','hello']

如何根据空白字符串元素将这个列表拆分为两个列表或任意数量的列表?

然后可以将所有这些列表放入一个列表列表中。

【问题讨论】:

  • 我们现在可以写下任何类型的解决方案 - 但您是否尝试自己先解决这个问题?也许您向我们展示了您尝试过的代码,我们就如何改进向您提供反馈?
  • 这就是我卡住的地方。我可以创建一个变量来给出我想要的列表数量,但我不知道从那里做什么
  • 我已经看到了一些答案。如果您想自己尝试而不采用预定义的方法,您可以尝试初始化一个空的结果列表和一个临时列表。遍历当前列表并检查元素。如果不为空,则将其追加到临时列表中,否则将临时列表追加到结果列表中并初始化一个新的临时列表。一旦到达迭代结束,您只需要附加临时列表。这不是简单的解决方案,但自己实现它会让您对如何使用 python 列表有很好的感觉。

标签: python list


【解决方案1】:

如果确定列表中只有一个空字符串,可以使用str.index查找空字符串的索引,然后对列表进行相应的切片:

index = lst.index('')
[lst[:index], lst[index + 1:]]

如果列表中可能有多个空白字符串,您可以像这样使用itertools.groupby

lst = ['jeff','ham','boat','','my','name','hello','','hello','world']
from itertools import groupby
print([list(g) for k, g in groupby(lst, key=bool) if k])

这个输出:

[['jeff', 'ham', 'boat'], ['my', 'name', 'hello'], ['hello', 'world']]

【讨论】:

    【解决方案2】:

    使用itertools.groupby,您可以:

    from itertools import groupby
    
    lst = ['jeff','ham','boat','','my','name','hello']
    
    [list(g) for k, g in groupby(lst, key=bool) if k]
    # [['jeff', 'ham', 'boat'], ['my', 'name', 'hello']]
    

    使用bool作为分组键函数利用了空字符串是唯一非真实字符串这一事实。

    【讨论】:

      【解决方案3】:

      这是一种使用简单迭代的方法。

      例如:

      myList = ['jeff','ham','boat','','my','name','hello']
      result = [[]]
      for i in myList:
          if not i:
              result.append([])
          else:
              result[-1].append(i)
      print(result)
      

      输出:

      [['jeff', 'ham', 'boat'], ['my', 'name', 'hello']]
      

      【讨论】:

        【解决方案4】:

        让 list_string 成为您的列表。这应该可以解决问题:

        list_of_list=[[]]
        for i in list_string:
            if len(i)>0:
                list_of_list[-1].append(i)
            else:
                list_of_list.append([])
        

        基本上,您创建一个列表列表,然后遍历原始字符串列表,每次遇到一个单词时,将其放在列表列表的最后一个列表中,每次遇到 '' ,您在列表列表中创建一个新列表。您的示例的输出将是:

        [['jeff','ham','boat'],['my','name','hello']]
        

        【讨论】:

          【解决方案5】:

          我不确定这是您想要做的,但请尝试:

          my_list = ['jeff','ham','boat','','my','name','','hello']
          list_tmp = list(my_list)
          final_list = []
          while '' in list_tmp:
              idx = list_tmp.index('')
              final_list.append(list_tmp[:idx])
              list_tmp = list_tmp[idx + 1:]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            • 2014-06-02
            • 1970-01-01
            相关资源
            最近更新 更多