2013-07-17 8 views
5

İşte sahip olduğum sorunun bir gösterimi. Python'a oldukça yeniyim, bu yüzden eminim ki çok açık bir şeyle karşılaşıyorum. Ben başlamak programda bir argüman olarak belirtilen endekslerin keyfi bir listesini kullanabilirsiniz böyleceNeden Python operator.itemgetter çalışma endeksleri olarak sayıların virgülle ayrılmış listesi verilir, ancak aynı liste bir değişken olarak paketlenmiş değilken?

import operator 

lista=["a","b","c","d","e","f"] 
print operator.itemgetter(1,3,5)(lista) 
>> ('b', 'd', 'f') 

columns=1,3,5 
print operator.itemgetter(columns)(lista) 
>> TypeError: list indices must be integers, not tuple 

Nasıl bu soruna alabilirim?

cevap

16

Bu itemgetter ilgili değil ama işlevi hakkında sözdizimi çağırarak. Bunlar farklı şeylerdir:

operator.itemgetter(1, 3, 5) 

operator.itemgetter((1, 3, 5)) 

birincisi size madde 1., madde 3. ve öğe 5. alır. İkincisi size eşya # alır (1, 3, 5). (Ancak listesi için, bir sözlük için mantıklı olabilir hangisi.)

ikinci bir sen itemgetter(columns) kullandığınızda ne elde ediyoruz. Peki, ilk sen nasıl alırsın?

operator.itemgetter(*columns) 

İşte bu kadar.

fazla bilgi için eğitimde Unpacking Argument Lists bakınız.

+0

teşekkürler! Farkında olmadığım dilin çok kullanışlı bir yönü. – user2066631

3

Sen itemgetter bireysel argümanları geçmesi gerekiyor. columns Burada mısın işlev çağrısında açmaktır * operatörünü kullanabilirsiniz (1, 3, 5) bir başlık olur. *, bir listeyi genişletir veya tüm tuple'ı bir argüman olarak iletmekten ziyade, değerleri bağımsız argümanlar olarak gönderilir. Örneğin

: func(*(1, 2, 3)) == func(1, 2, 3)

böylece gerekenler:

columns=1,3,5 
print operator.itemgetter(*columns)(lista) 
İlgili konular