Почему двухсторонняя очередь, построенная из одного списка, возвращает свой элемент, а не сам список? - PullRequest
0 голосов
/ 25 мая 2020

Я запускаю код ниже:

from collections import deque
q = deque([('0000',0)])
a = q.popleft()

print(a)
print(type(a))

b = [('0000',0)]

print(b)
print(type(b))

И вывод:

('0000', 0)
<class 'tuple'>
[('0000', 0)]
<class 'list'>

Интересно, почему тип a равен tuple, а b равен list. Я ожидал, что q.popleft() вернет [('0000', 0)].

Ответы [ 4 ]

6 голосов
/ 25 мая 2020

deque принимает итерацию в качестве аргумента. Затем он распаковывает эту итерацию, чтобы элементы заполняли двухстороннюю очередь.

ie, если вы передадите

[1, 2, 3]

в deque как

q = deque([1, 2, 3])

двухсторонняя очередь будет иметь элементы 1, 2 и 3. Не [1, 2, 3]

(из этого следует, что вы не можете инициализировать deque с несколькими аргументами, которые будут использоваться в качестве его элементов.)

Если вы думаете о deque только как о списке ,

deque([1,2,3]) эквивалентно списку [1,2,3], а не [[1, 2, 3]]. Чтобы это было эквивалентно [[1, 2, 3]], вам нужно будет позвонить deque([[1,2,3]])

4 голосов
/ 25 мая 2020

Похоже, у вас есть две коллекции, deque с именем q и list с именем b. Обе эти коллекции содержат один элемент, кортеж ('0000',0).

Когда вы определили a, вы вытащили этот элемент из q, поэтому a - это только кортеж. Однако вы не выполняли аналогичную операцию с b. Аналогичное может быть

c = b.pop()

, и в этом случае c - это кортеж.

2 голосов
/ 25 мая 2020

a - это кортеж, потому что его значения заключены в круглые скобки ( ), а b - это список кортежей, так как in содержит кортеж ('0000', 0) внутри квадратных скобок [ ].

Чтобы обе переменные были кортежем, вам нужно переписать b следующим образом:

b = ('0000',0)

deque принимает итерабельность, например list, strings и т. Д. c. и создает из него двустороннюю очередь. Итак, теперь ваш список превратился в исключенную из очереди. И когда вы вызываете метод popleft() для объекта deque, он удаляет первый элемент из очереди и возвращает его. В этом случае элемент был ('0000', 0). Следовательно, тип элемента регистрируется как tuple.

Во втором сценарии вы печатаете тип переменной, которая содержит list из tuple s.

1 голос
/ 25 мая 2020

Я думал, что когда я создаю двухстороннюю очередь q = deque([('0000',0)]), первым элементом будет [('0000',0)].

Теперь я понимаю, что когда я создаю такую ​​очередь, первым элементом будет ('0000',0)

И я могу инициировать двухстороннюю очередь с большим количеством элементов, например q = deque([('0000',0),('0002',0)])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...