Как перестать добавлять значения после того, как длина списка достигает определенного предела? - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать функцию, которая позволяет добавлять до одного количества элементов из одного списка в другой.Счетчик вернет количество элементов, которые были добавлены в список до того, как был достигнут лимит (в данном случае - 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'] передается в качестве аргумента items и [4, 5,6, 7, 8, 9, «корова»] передается как очередь, любая помощь в том, что я делаю неправильно, очень ценится!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Если вы просто хотите исправить свою функцию с минимальными обновлениями, вы можете попробовать код ниже.В противном случае Blckknght дал более питонное и эффективное решение.

x = 10

def multienqueue(queue, items):
    counter = 0
    for i in items:
        if len(queue) < x:
            queue.append(i)
            counter += 1
    return counter
0 голосов
/ 18 ноября 2018

Условие в вашем цикле while проверяется только тогда, когда достигнут конец тела цикла и он пытается перезапуститься.Это никогда не происходит в вашем коде.Вместо этого ваш цикл for добавляет все значения от items до queue, и вы всегда возвращаете количество значений в 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

Обратите внимание, что более Pythonic подход, вероятно, будет использоватьитераторы, а не вырезать из списка.itertools.islice может принимать определенное количество значений от итератора.В этом случае вам может не потребоваться возвращать счетчик, поскольку в итераторе по-прежнему будут содержаться только те значения, которые не были добавлены.

...