【问题标题】:python generate sublist with offset and conditionpython生成带有偏移量和条件的子列表
【发布时间】:2014-06-20 13:04:33
【问题描述】:

嘿,我正在尝试生成列表的子列表。例如,我有一个这样的列表:
l = [1,2,3,4,5,6,7,8,9,10,11,12]

我想将它们拆分为长度为 4 的子列表。但是第一个元素与上一个列表中的最后一个元素相同,并且就像我说的它的长度必须为 4。像这样:

l1 = [1,2,3,4]
l2 = [4,5,6,7]
l3 = [7,8,9,10] 
l4 = [10, 11, 12] <-- should be ignored

有人有想法吗?!我正在考虑一个生成器,但我不太确定。

【问题讨论】:

  • 你肯定尝试过。展示它!

标签: python list generator


【解决方案1】:

一个简单但灵活的生成器实现:

def overlapping_sublists(l, n, overlap=1, start=0):          
    while start <= len(l) - n:
        yield l[start:start+n]
        start += n - overlap

示例用法:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> list(overlapping_sublists(l, 4))
[[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]
>>> list(overlapping_sublists(l, 4, 2, 3))
[[4, 5, 6, 7], [6, 7, 8, 9], [8, 9, 10, 11]]

【讨论】:

    【解决方案2】:
    a = []
    l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    for i in range(0, len(l)-3, 3):
        a.append(l[i:i+4])
    

    会给a = [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]

    或者您可以用作列表推导:

    [l[i:i+4] for i in range(0, len(l)-3, 3)]
    

    【讨论】:

    • 这是一个列表理解,而不是生成器。
    • @tobias_k 将[ 更改为( 使其成为生成器表达式。
    【解决方案3】:
    print([l[i:i+4] for i in range(0, len(l), 3)])
    

    输出:

    [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10], [10, 11, 12]]
    

    只有长度为 4 的子列表:

    print([m for m in [l[i:i+4] for i in range(0, len(l), 3)] if len(m) == 4])
    

    输出:

    [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]]
    

    使用生成器:

    for n in (m for m in (l[i:i+4] for i in range(0, len(l), 3)) if len(m) == 4):
        print(n)
    

    输出:

    [1, 2, 3, 4]
    [4, 5, 6, 7]
    [7, 8, 9, 10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      相关资源
      最近更新 更多