Birinci öğedeki bir listeyi ve tek bir komuttaki "kuyruk" u açmanın pitonik bir yolu var mı?
Örneğin:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
Birinci öğedeki bir listeyi ve tek bir komuttaki "kuyruk" u açmanın pitonik bir yolu var mı?
Örneğin:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
Yanıtlar:
Python 3.x altında, bunu güzelce yapabilirsiniz:
>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
3.x'teki yeni bir özellik, *
herhangi bir ekstra değer anlamında operatörü ambalajı açarken kullanmaktır . PEP 3132 - Uzatılmış Tekrarlanabilir Ambalajdan Çıkarma'da açıklanmaktadır . Bu aynı zamanda sadece sekanslar üzerinde değil, herhangi bir tekrarlanabilir üzerinde çalışma avantajına da sahiptir.
Aynı zamanda gerçekten okunabilir.
PEP'de açıklandığı gibi, eşdeğerini 2.x altında yapmak istiyorsanız (potansiyel olarak geçici bir liste oluşturmadan), bunu yapmanız gerekir:
it = iter(iterable)
head, tail = next(it), list(it)
Yorumlarda belirtildiği gibi, bu aynı zamanda head
bir istisna atmak yerine varsayılan bir değer elde etme fırsatı da sağlar . Bu davranışı istiyorsanız, next()
varsayılan bir değere sahip isteğe bağlı ikinci bir argüman alır, böylece head öğesi yoksa next(it, None)
size verir None
.
Doğal olarak, bir liste üzerinde çalışıyorsanız, 3.x sözdizimi olmadan en kolay yol şudur:
head, tail = seq[0], seq[1:]
__getitem__
/ __setitem__
yapabilir, ancak yerleşik liste bunu yapmaz.
python 3.x
O (1) head,tail
operasyon karmaşıklığı için, deque
ancak kullanmanız gerekir .
Takip eden yol:
from collections import deque
l = deque([1,2,3,4,5,6,7,8,9])
head, tail = l.popleft(), l
Listenin tüm öğelerini yinelemeniz gerektiğinde kullanışlıdır. Örneğin, birleştirme sıralamasında 2 bölümün saf birleştirilmesinde.
head, tail = l.popleft(), l
zaman ~ O (1) olur. head, tail = seq[0], seq[1:]
O (n).
head = l.popleft()
ve tail
bunun sadece bir takma adı l
. Eğer l
değişiklikler tail
de değişir.
Python 2, lambda kullanarak
>>> head, tail = (lambda lst: (lst[0], lst[1:]))([1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
head, tail = lst[0], lst[1:]
? OP kelimesi kelimesi kelimesini kullanmak anlamına gelirse, o zaman baş ve kuyruğu manuel olarak bölebilirhead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
önceki satırda hayır ). (2) Yapmak head, tail = lst[0], lst[1:]
, kodu yan etkilere açık bırakır (düşünün head, tail = get_list()[0], get_list()[1:]
) ve Op'ın formundan farklıdır head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
.
Bina @GarethLatty Python 2 çözeltisi , aşağıdaki Python 2 içinde bir ara madde değişken olmayan tek bir satırı eşdeğeri almak için bir yöntemdir.
t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0]
İstisnalara karşı korumalı olması gerekiyorsa (yani boş listeyi destekliyor), o zaman şunu ekleyin:
t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]
Bunu noktalı virgül olmadan yapmak istiyorsanız, şunu kullanın:
h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]