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 № 1Ogó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])