【问题标题】:Create sublists by splitting list at a value通过在某个值处拆分列表来创建子列表
【发布时间】:2016-11-25 03:45:02
【问题描述】:

我有一个很长的清单。下面是它的摘录。

['1',  '15943882',  '63',  '1',  '-9',  '-9',  '-9',  '-27',  '1',  '145',  
 '1',  '233',  '-9',  '50',  '20',  '1',  '0',  '1',  '2',  '2',  '3',  
 '1981',  '0',  '0',  '0',  '0',  '0',  '1',  '10.5',  '6', '13',  '150',  
 '60',  '190',  '90',  '145',  '85',  '0',  '0',  '2.3', '3',  '-9',  '-9',  
 '0',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '6',  '-9',  '-9',  '-9',  
 '2',  '16',  '1981',  '0',  '1',  '1',  '1',  '-9',  '1',  '-9',  '1',  
 '-9',  '1',  '1',  '1',  '1',  '1',  '1',  '1',  '-9',  '-9',  '0',  '-9',  
 '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '0',  '0',  '0',  
 '0',  'name',  '2',  '15964847',  '67',  '1',  '-9',  '-9',  '-9',  '-27',  
 '4',  '160',  '1',  '286',  '-9',  '40',  '40',  '0',  '0',  '1',  '2',  
 '3',  '5',  '1981',  '0',  '1',  '0',  '0',  '0',  '1',  '9.5',  '6', 
 '13',  '108',  '64',  '160',  '90',  '160',  '90',  '1',  '0',  '1.5',  
 '2',  '-9',  '-9',  '3',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '3',  
 '-9',  '-9',  '-9',  '2',  '5',  '1981',  '2',  '1',  '2',  '2',  '-9',  
 '2',  '-9',  '1',  '-9',  '1',  '1',  '1',  '1',  '1',  '1',  '1',  '-9',  
 '-9',  '0',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  '-9',  
 '0',  '0',  '0',  '0',  'name']

如何创建 2 个以值 'name' 拆分的列表?值'name' 的索引在整个列表中并不总是相同的,仅供参考。

【问题讨论】:

  • 使用my_list.index('name')获取需要拆分的索引...
  • 如果列表中有多个name怎么办?您希望拆分是递归的吗?
  • 一如既往,这不是代码编写服务。你试过什么?
  • 我已经尝试了一些东西,但它从来没有真正成功过。我编写了一个 for 循环来查找“name”每次出现的索引,但认为这不是最佳解决方案。不知所措,我选择在这里问。我猜想在帖子中可以指定我想要一个更简洁的 Pythonic 解决方案。
  • 冒着多余的风险,我确实查找了其他线程,但没有找到任何匹配项。如果没有看到那里有什么,我不会发布问题。

标签: python list split sublist


【解决方案1】:

要将列表拆分为多个 name 元素,您可以使用标准模块中的 itertools.groupby()

>>> import itertools as it
>>> data = ['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', '1', ...]
>>> [list(g) for k, g in it.groupby(data, lambda x: x=='name') if not k]
[['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', ...
 ['2', '15964847', '67', '1', '-9', '-9', '-9', '-27', '4', '160', ...

【讨论】:

    【解决方案2】:
    idx = x.index('name')
    (x[0:idx], x[idx+1:])
    

    这将在 'name' 的第一个索引处拆分。

    【讨论】:

      【解决方案3】:

      iteration_utilities 库中有一个 split 函数在这种情况下可能很有用:

      >>> from iteration_utilities import split
      >>> l1, l2 = split(your_list, key='name', eq=True)
      >>> l1
      ['1', '15943882', '63', '1', '-9', '-9', '-9', '-27', '1', '145', '1', 
       '233', '-9', '50', '20', '1', '0', '1', '2', '2', '3', '1981', '0', 
       '0', '0', '0', '0', '1', '10.5', '6', '13', '150', '60', '190', '90', 
       '145', '85', '0', '0', '2.3', '3', '-9', '-9', '0', '-9', '-9', '-9', 
       '-9', '-9', '-9', '6', '-9', '-9', '-9', '2', '16', '1981', '0', '1', 
       '1', '1', '-9', '1', '-9', '1', '-9', '1', '1', '1', '1', '1', '1', 
       '1', '-9', '-9', '0', '-9', '-9', '-9', '-9', '-9', '-9', '-9', '-9',
       '-9', '0', '0', '0', '0']
      

      请注意,这会从结果中删除key(在本例中为'name')。

      该功能还可以将列表拆分为多个部分,如果不需要,您可以指定maxsplit=1

      注意:我是库 iteration_utilities 的作者。顺便提一下:用纯Python实现这个功能也很容易:

      def split(iterable, delimiter):
          lst = []
          for item in iterable:
              if item == delimiter:
                  yield lst
                  lst = []
              else:
                  lst.append(item)
          if lst:
              yield lst
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2014-12-10
        • 2022-08-13
        • 2020-07-05
        • 1970-01-01
        相关资源
        最近更新 更多