/ / Python: Konwertuj n-tuple na x-tuple gdzie x <n - python, python-2.7, tuple

Python: Konwertuj n-tuple na x-tuple, gdzie x <n - python, python-2.7, tupty

Pytanie jest dość proste (w przeciwieństwie do tytułu). Mam typ krotki:

p = (1, 2, 3, 4, 5, 6)
# I refer to this as a 6-tuple but p could be an n-tuple

Muszę przekonwertować to na mniejszą krotkę jak:

(a, b) = p

takie, że a <- 1 i b <- (2, 3, 4, 5, 6)

EDYTOWAĆ:

Potrzebuję kodu dla Pythona v2.7. Powinienem też wspomnieć, że istnieją sposoby, aby to zrobić, ale szukam czegoś naturalnego i czegoś, w czym nie muszę zajmować się wskaźnikami.

a, b, c, d, e = p[0], p[1], p[2], p[3], p[4], p[5:]

nie jest pożądane.

EDYCJA 2:

W powyższym przykładzie a jest liczbą całkowitą, podczas gdy bto nasza nowa krotka. Ideą od n-tuple do x-tuple jest to, że długość nowej krotki jest mniejsza niż pierwotna. W poniższym przykładzie mamy 0-tuples (int):

a, b, c = (1, 2, 3)

Jeśli jednak jest to:

a, b, c, d = (1, 2, 3)

Następnie mamy a <- 1, b <- 2, c <-3, d <- None/Nothing.

Odpowiedzi:

3 dla odpowiedzi № 1

Ogólne rozwiązanie:

def split_after(lst, n):
for i in range(n):
yield lst[i]
yield lst[n:]

Wynik:

>>> a,b,n = split_after(p,2)
>>> a
1
>>> b
2
>>> n
(3, 4, 5, 6)
>>> l = list(split_after(p,3))
>>> l
[1, 2, 3, (4, 5, 6)]

Musisz wiedzieć, ile masz przedmiotówpo lewej stronie i powiedz to do funkcji (ponieważ nie może tego samo powiedzieć, w przeciwieństwie do tego, co pozwala na to rozszerzona składnia rozpakowania krotki w Pythonie 3).


2 dla odpowiedzi nr 2

Możesz to zrobić

a, b = p[0], p[1:]

To jest przykład

>>> p = (1,2,3,4,5)
>>> a, b = p[0], p[1:]
>>> a
1
>>> b
(2, 3, 4, 5)

2 dla odpowiedzi nr 3

Jeśli używasz Pythona 3, jest to banalne z użyciem rozszerzone iterowalne rozpakowywanie składnia:

>>> p = (1, 2, 3, 4, 5, 6)
>>> a, *b = p
>>> a
1
>>> b
[2, 3, 4, 5, 6]

b dostaje się do listy, ponieważ RHS może być dowolną iterowalną, ale możesz zrobić b = tuple(b) jeśli naprawdę potrzebujesz, żeby była dokładnie krotką.

To trochę różni się od twoich późniejszych przykładów:

a, b, c = (1, 2, 3)

Ta składnia jest już legalna w Pythonie 2 i zrobi to, co należy, jeśli LHS i RHS mają taką samą liczbę elementów. To jest tylko case, który będzie działać w Pythonie 2 bez odtwarzania z indeksowaniem.

Używać * również będzie działał tutaj w Pythonie 3, ale zmienna, do której ją dodasz, będzie działać zawsze być listą - nawet jeśli ma tylko jeden przedmiot:

>>> a,b,*c = (1, 2, 3)
>>> c
[3]

Ale w twoim ostatnim przykładzie zrobi z grubsza to, co chcesz:

a, b, c, *d = (1, 2, 3)
>>> d
[]

to znaczy, d to raczej pusta lista niż None.


1 dla odpowiedzi nr 4

W Python2 RHS musi rozpakować do odpowiedniej liczby elementów, aby pasowały do ​​LHS. Możesz uniknąć indeksów takich hacków. Ale wciąż potrzebujesz wiedzy na temat liczby przedmiotów, które chcesz tam rozpakować.

>>> p = (1, 2, 3, 4, 5, 6)
>>> a, b = (lambda a, *b:(a, b))(*p)
>>> a
1
>>> b
(2, 3, 4, 5, 6)

0 dla odpowiedzi № 5

Spowoduje to rekursywne podzielenie listy na podstawie listy indeksów podziału.

def split(lis, splits):
if not splits:
return [lis]
new_splits = [s - splits[0] for s in splits[1:]]
return [lis[:splits[0]]] + split(lis[splits[0]:], new_splits)

Stosowanie

>>> split([1,2,3,4,5,6],[2])
[[1,2], [3,4,5,6]]

>>> split([1,2,3,4,5,6],[2,4])
[[1,2], [3,4], [5,6]]

>>> split([1,2,3,4,5,6],[2,4,8])
[[1,2], [3,4], [5,6], []]

Którego możesz użyć w ten sposób:

>>> a,b,c,d = split([1,2,3,4,5,6],[2,4,8])