2009-05-28 2 views
2

Я хочу выполнить функциональное совпадение с шаблоном, чтобы получить первые два элемента, а затем остальное возвращаемое значение массива.python - match on array return value

Например, предположим, что перманент (х) возвращает список значений, и я хочу сделать это:

seq=perms(x) 
a = seq[0] 
b = seq[1] 
rest = seq[2:] 

Конечно, я могу сократить до:

[a,b] = seq[0:2] 
rest = seq[2:] 

Могу ли я использовать некоторые обозначения для этого?

[a,b,more] = perms(x) 

или концептуально:

[a,b,more..] = perms(x) 

ПРОЛОГ & функциональные языки сделать список декомпозиции так хорошо, как это!

ответ

6

Вы можете сделать это в Python 3, как это:

(a, b, *rest) = seq 

Смотрите extended iterable unpacking PEP для более подробной информации.

2

Для Python 2, я знаю, что вы можете сделать это с помощью функции:

>>> def getValues(a, b, *more): 
    return a, b, more 

>>> seq = [1,2,3,4,5] 
>>> a, b, more = getValues(*seq) 
>>> a 
1 
>>> b 
2 
>>> more 
(3, 4, 5) 

Но не уверен, есть ли способ сделать это как Ayman's Python 3 suggestion

+2

немного короче: a, b, m = (lambda a, b, * more: (a, b, more)) (* seq) – Javier

+0

это способ для python-2.x – van

3

В Python 2, ваш вопрос очень близко в ответ уже:

a, b, more = (seq[0], seq[1], seq[2:]) 

или:

(a, b), more = (seq[0:2], seq[2:]) 
0

Очень приятно, спасибо.

Предложения, в которых один анализирует массив на стороне боя, не так хорошо работают для меня, поскольку я на самом деле хотел сопоставить шаблон с возвратом от выражения генератора.

для (а, Ь, более) в завивке (сл): ...

Мне нравится решение P3, но придется ждать Комодо, чтобы поддержать его!