【问题标题】:Creating an irregular list of lists from a single list从单个列表创建不规则的列表列表
【发布时间】:2019-09-15 09:44:27
【问题描述】:

我正在尝试从单个列表创建列表列表。如果新列表具有相同数量的元素,我可以这样做,但情况并非总是如此

如前所述,当列表列表具有相同数量的元素时,下面的函数起作用。

我尝试使用正则表达式来确定元素是否与使用模式匹配 pattern2=re.compile(r'\d\d\d\d\d\d') 因为我的新列表中的第一个值将始终为 6 位数字,并且它将是唯一遵循该格式的值。但是,我不确定让它在下一场比赛中停止并创建另一个列表的语法

def chunks(l,n):
    for i in range(0,len(l),n):
        yield l[i:i+n]

如果列表列表包含相同数量的元素,则上述代码有效

以下是我所期望的。

OldList=[111111,a,b,c,d,222222,a,b,c,333333,a,d,e,f]
DesiredList=[[111111,a,b,c,d],[222222,a,b,c],[333333,a,d,e,f]]

非常感谢。

干杯

【问题讨论】:

    标签: python regex python-3.x list


    【解决方案1】:

    可能是一种更有效的方法(循环更少),但这里有一种方法可以找到断点的索引,然后将列表从一个索引切到另一个索引,并将None 附加到索引列表的末尾捕获剩余的项目。如果您的 6 位数字确实是字符串,那么您可以消除 re.match() 中的 str()

    import re
    
    d = [111111,'a','b','c','d',222222,'a','b','c',333333,'a','d','e','f']      
    
    indexes = [i for i, x in enumerate(d) if re.match(r'\d{6}', str(x))]
    groups = [d[s:e] for s, e in zip(indexes, indexes[1:] + [None])]
    print(groups)
    # [[111111, 'a', 'b', 'c', 'd'], [222222, 'a', 'b', 'c'], [333333, 'a', 'd', 'e', 'f']]
    

    【讨论】:

      【解决方案2】:

      你可以使用折叠。

      首先,定义一个函数来定位开始标志:

      >>> def is_start_flag(v):
      ...     return len(v) == 6 and v.isdigit()
      

      如果标志不完全符合您的预期,或者排除一些误报,或者即使您需要正则表达式,这将很有用。

      然后使用functools.reduce:

      >>> L = d = ['111111', 'a', 'b', 'c', 'd', '222222', 'a', 'b', 'c', '333333', 'a', 'd', 'e', 'f']
      >>> import functools
      >>> functools.reduce(lambda acc, x: acc+[[x]] if is_start_flag(x) else acc[:-1]+[acc[-1]+[x]], L, [])
      [['111111', 'a', 'b', 'c', 'd'], ['222222', 'a', 'b', 'c'], ['333333', 'a', 'd', 'e', 'f']]
      

      如果下一个元素 x 是开始标志,则将新列表 [x] 附加到累加器。否则,将元素添加到当前列表,即累加器的最后一个列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        • 2022-06-10
        相关资源
        最近更新 更多