2010-08-18 15 views
38

Python 3'te yapmam mümkün olacak düşünüyorum:Bir listeyi ilk olarak bölme ve dinlenmenin pythonik yolu?

first, *rest = l 
tam istediğim budur

ama 2.6 kullanıyorum. Şimdilik yapıyorum:

first = l[0] 
rest = l[1:] 

Bu iyi, ama sadece daha zarif bir şey olup olmadığını merak ediyordum.

+6

yukarıda iyi olduğunu düşünüyorum. Her zaman ilkini yapabilirsin, dinlenme = l [0], l [1:] '. – katrielalex

+4

Gerçekten de, yukarıdakileri geliştiremezsiniz - http://www.python.org/dev/peps/pep-3132/. – katrielalex

+1

İlgili: https://stackoverflow.com/questions/10532473/python-head-and-tail-in-one-line –

cevap

29
first, rest = l[0], l[1:] 

Temel olarak aynı, bir oneliner olması dışında. Tuple atama kayaları.

i = iter(l) 
first = next(i) # i.next() in older versions 
rest = list(i) 
+4

Daha iyi: 'first, last = l [: 1], l [1:]' in 'l' boş (ve daha güzel;). –

+4

Bunların semantik olarak aynı olmadıklarını belirtmeliyiz: 'l [: 1]' bir listedir, 'l [0]' listenin bir öğesidir. –

12

Sen

first = l.pop(0) 

yapabilir ve daha sonra l olacaktır:

Bu biraz daha uzun ve daha az belirgin, ancak genelleştirilmiş bütün Iterables için (yerine sliceables sınırlı kalmak) 'dir dinlenme. Yine de, orijinal listenizi değiştirir, bu yüzden belki de sizin istediğinizi değil.

+2

Hey! Pop'a endeks sağlayabileceğini bilmiyordum. Bu sıradışı ama kullanışlı! Listelerde neden vardiya yöntemi olmadığını merak ediyordum. Teşekkürler! – Shawn

+0

Bu boş listelerde çalışmayacak: '' 'x = []; x.pop (0) traceback (en son çağrı son): Dosya "", 1 numaralı hat IndexError içinde: Boş listeden '' '' – avyfain

-2

öneririm:

first, remainder = l.split(None, maxsplit=1) 
+0

list 'yok pop bir '.split() yöntem. – cpburnz

+0

ooops! benim hatam, bir dizgiye rağmen – FGH

İlgili konular