剪切清单清单

时间:2018-07-08 08:59:27

标签: python python-3.x algorithm list

给出一个限制和一个包含任意数量项目的列表列表,我想剪切列表列表,其中限制为所有列表中项目的总数。

到目前为止,我的努力:

lol = [['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s', '0', 'u', 'x']]

def cut_lol(lol, n):
    count = 0
    result = []
    for l in lol:
        if count + len(l) > (n):
            new_len_l = count + len(l) - n
            result.append(l[:new_len_l])
            return result
        result.append(l)
        count += len(l)
    return result

但是此功能有问题,我看不到什么。

例如:

print(cut_lol(lol, 8))
# returns    [['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s', '0', 'u']]
# should be: [['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s']]


print(cut_lol(lol, 4))
# returns    [['a', 'v', '1', 'r'], ['d', 'x', 'b']]
# should be: [['a', 'v', '1', 'r']]


print(cut_lol(lol, 3))
# returns    [['a']]
# should be: [['a', 'v', '1']]

有人可以帮助我完成这项工作吗?谢谢!

2 个答案:

答案 0 :(得分:3)

进行最小的更改以使其起作用:

lol = [['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s', '0', 'u', 'x']]

def cut_lol(lol, n):
    count = 0
    result = []
    for l in lol:
        if count + len(l) > (n):
            new_len_l = n - count
            if new_len_l:
                result.append(l[:new_len_l])
            return result
        result.append(l)
        count += len(l)
    return result

简化版:

lol = [['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s', '0', 'u', 'x']]

def cut_lol(lol, n):
    count = 0
    result = []
    for l in lol:
        to_read = n - count
        if to_read <= 0:
            break
        result.append(l[:to_read])
        count += len(l)
    return result

答案 1 :(得分:2)

我们可以通过for循环和有条件的返回来完成此操作:

def cut_lol(lol, n):
    result = []
    for li in lol:
        if n <= 0:
            return result
        sli = li[:n]
        result.append(sli)
        n -= len(sli)
    return result

因此,这里我们遍历li中的子列表lol。每次我们检查元素n的剩余数量是否已经达到零时,在这种情况下,我们将返回到目前为止获得的结果。否则,我们将附加一个子列表的切片版本,使其最多包含n个元素。我们每次减少数字。

我们可以通过以下条件来提高效率:

def cut_lol(lol, n):
    result = []
    for li in lol:
        if n <= 0:
            return result
        sli = li
        if len(sli) > n:
            sli = sli[:n]
        result.append(sli)
        n -= len(sli)
    return result

示例输出

>>> cut_lol(lol, 0)
[]
>>> cut_lol(lol, 1)
[['a']]
>>> cut_lol(lol, 2)
[['a', 'v']]
>>> cut_lol(lol, 3)
[['a', 'v', '1']]
>>> cut_lol(lol, 4)
[['a', 'v', '1', 'r']]
>>> cut_lol(lol, 5)
[['a', 'v', '1', 'r'], ['d']]
>>> cut_lol(lol, 6)
[['a', 'v', '1', 'r'], ['d', 'x']]
>>> cut_lol(lol, 7)
[['a', 'v', '1', 'r'], ['d', 'x', 'b']]
>>> cut_lol(lol, 8)
[['a', 'v', '1', 'r'], ['d', 'x', 'b'], ['s']]

这也适用于元组和其他可切片对象(在这种情况下,结果将是这些已切片对象的列表)。