Несколько Распаковывающие Присвоение в Python, когда Вы не знаете длины последовательности

Примеры из учебника нескольких распаковывающих присвоение являются чем-то как:

import numpy as NP
M = NP.arange(5)
a, b, c, d, e = M
# so of course, a = 0, b = 1, etc.

M = NP.arange(20).reshape(5, 4)     # numpy 5x4 array
a, b, c, d, e = M
# here, a = M[0,:], b = M[1,:], etc. (ie, a single row of M is assigned each to a through e)

(Мой вопрос не numpy конкретный. Действительно, я предпочел бы чистое решение Python.)

Для части кода я смотрю на теперь, я вижу две сложности на том простом сценарии:

  • Я обычно не буду знать форму M; и

  • Я хочу распаковать определенное число объектов (определенно меньше, чем все объекты), и я хочу поместить остаток в единственный контейнер

Таким образом, назад к 5x4 выстраивают выше, что я очень хотел бы сделать, присваивают первые три строки M к a, b, и c соответственно (точно как выше), и остальная часть строк (я понятия не имею, сколькими будет, просто некоторое положительное целое число) к единственному контейнеру, all_the_rest = [].

13
задан Michael 16 August 2018 в 16:17
поделиться

2 ответа

Python 3.x может сделать это легко:

a, b, *c = someseq

Python 2.x требует немного больше работы:

(a, b), c = someseq[:2], someseq[2:]
29
ответ дан 1 December 2019 в 18:54
поделиться

Синтаксис для этого добавлен в Python 3

>>> # Python 3.x only
>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]

, но аналогичного решения не существует в Python 2.

Вы, конечно, можете использовать

>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (a, b, c), rest = s[0:3], s[3:]
>>> a
0
>>> b
1
>>> c
2
>>> rest
[3, 4, 5, 6, 7, 8, 9]

или другие подобные решения.

11
ответ дан 1 December 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: