如何在列表长度达到一定限制后停止附加值?

时间:2018-11-18 18:44:46

标签: python python-3.x list loops queue

我正在尝试创建一个函数,该函数允许将一个列表中最多x个项目添加到另一个列表中。计数器将返回达到限制之前添加到列表的项目数量(在这种情况下,限制为10)

到目前为止,我的代码是:

x = 10

def multienqueue(queue, items):
    counter = 0
    while len(queue) < x:
        for i in items:
            queue.append(i)
            counter += 1
    return counter

但是,我收到的输出是:

list = [4, 5, 6, 7, 8, 9, 'cow']
Trying to enqueue the list ['a', 'b', 'c', 'd', 'e']
The number added should be 3.
The number added was 5
The queue should now be: [4, 5, 6, 7, 8, 9, 'cow', 'a', 'b', 'c']
Your queue is: [4, 5, 6, 7, 8, 9, 'cow', 'a', 'b', 'c', 'd', 'e']

['a','b','c','d','e']作为item参数传递,而[4,5,6,7,8,9,'cow']被传递作为队列,对我正在做的事情的任何帮助都将受到赞赏!

2 个答案:

答案 0 :(得分:0)

while循环中的条件仅在到达循环主体的末端并尝试重新启动时才检查。这在您的代码中永远不会发生。而是,您的for循环将所有从itemsqueue的值相加,并且您总是返回items中的值数。 while循环再也不会运行,因为return语句首先结束了该函数。

如果要保持代码的常规结构不变,则需要对其进行更改,以便在添加每个项目后执行对足够长的列表的检查。这意味着您只需要一个循环,而不是两个互相嵌套。您可以使其与foo循环(与循环逻辑分开检查长度,并可能使用break来提前退出)或while循环(使用不同的逻辑找出要附加的项目,例如queue.append(items[count])

但是更好的方法可能是计算要添加到队列中的项目数。然后,您可以使用切片来从items获取正确的数字值,并使用list.extend一次将它们添加到队列中。

def multienqueue(queue, items):
    num = max(0, min(x - len(queue), len(items)))
    queue.extend(items[:num])
    return num

请注意,更Python化的方法可能是使用迭代器,而不是从列表中切片。 itertools.islice可以从迭代器中获取特定数量的值。在这种情况下,您可能不需要返回计数,因为迭代器中仍将只保留未附加的值。

答案 1 :(得分:0)

如果您只想用最少的更新来修复功能,则可以尝试以下代码。否则,Blckknght会提供一个更加Python高效的解决方案。

x = 10

def multienqueue(queue, items):
    counter = 0
    for i in items:
        if len(queue) < x:
            queue.append(i)
            counter += 1
    return counter