Используя карту с queue.put ()?

1

Чтобы загрузить список в очередь в Python, я нашел этот фрагмент кода, который не работал. Ничего не добавлено в очередь:

from queue import Queue
my_list = [1,2,3,4,5,6,7,8,9,10]
q = Queue()

# This code doesn't work
map(q.put, my_list)
q.qsize() # Returns zero, which is unexpected

Более подробное решение:

for num in my_list:
    q.put(num)
print(q.qsize())  # returns 10 as expected

работает, как ожидалось. Что мне здесь не хватает?

  • 2
    Использование карты как это не идиоматический питон. Я бы придерживался цикла for, потому что вам все равно придется оценивать карту.
Теги:

3 ответа

4
Лучший ответ

map(q.put, my_list) просто возвращает итератор. Если вы не перейдете через него, ваша очередь q будет заполнена

>>> q = Queue()
>>> itr = map(q.put, my_list)
>>> q.qsize()
0
>>> _ = list(map(q.put, my_list))
>>> q.qsize()
10
  • 0
    Вы можете продемонстрировать это, выполнив list(map(q.put, my_list))
  • 0
    Является ли использование for цикла наиболее питоническим способом?
0

Я не знаю, почему это не работает для вас. Возможно, ваша версия python, я на 2.7.6

from queue import Queue
my_list = [1,2,3,4,5,6,7,8,9,10]
q = Queue()

# This code doesn't work
map(q.put, my_list)
q.qsize()

print q.qsize() # 10

while not q.empty():
    print q.get()
  • 1
    Я на Python 3 - это может быть проблема версии?
  • 1
    Это определенно проблема. Это изменение для Python 3
Показать ещё 1 комментарий
0

Это не так, как работает map:

from queue import Queue
l = [i for i in range(10)]
q = Queue()
x = map(q.put, l)
q.qsize()
# Output: 0
for _ in x:
    pass
q.qsize()
# Output: 10

Вы можете получить то, что хотите, используя ThreadPool:

from queue import Queue
from multiprocessing.pool import ThreadPool
l = [i for i in range(10)]
p = ThreadPool()
q = Queue()
_ = p.imap_unordered(q.put, l)
q.qsize()
# Output: 10

Если вы хотите использовать другие встроенные модули:

# list comprehension (essentially what map is equivalent to)
_ = [q.put(i) for i in l]

# the 'any' method:
_ = any(q.put(i) for i in l)
  • 0
    Другими словами, в Python 3.x map() возвращает ленивый итератор, а не список, как в Python 2.x, поэтому вы должны явно итерировать его, чтобы заставить его что-либо делать. В любом случае «более многословная» версия - лучшая идея, так как нет абсолютно никакого смысла в создании этой последовательности None .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню