2009-10-01 5 views
2

Je suis un débutant à Python. Considérez la fonction str.partition() qui renvoie un 3-uplet. Si je ne m'intéresse qu'aux éléments 0 et 2 de ce tuple, quelle est la meilleure façon de ne sélectionner que certains éléments d'un tel tuple?Comment sélectionner certains éléments de x-tuple renvoyés par une fonction?

Je peux le faire actuellement soit:

# Introduces "part1" variable, which is useless 
(part0, part1, part2) = str.partition(' ') 

Ou:

# Multiple calls and statements, again redundancy 
part0 = str.partition(' ')[0] 
part2 = str.partition(' ')[2] 

Je voudrais pouvoir faire quelque chose comme ça, mais ne peut pas:

(part0, , part2) = str.partition(' ') 
# Or: 
(part0, part2) = str.partition(' ')[0, 2] 

Répondre

13

Souligné est souvent utilisé comme un nom pour des choses que vous n'avez pas besoin, donc quelque chose comme ça fonctionnerait:

part0, _, part2 = str.partition(' ') 

Dans ce cas particulier, vous pouvez le faire, mais ce n'est pas solution assez:

part0, part2 = str.partition(' ')[::2] 

Une solution plus ésotérique:

from operator import itemgetter 
part0, part2 = itemgetter(0, 2)(str.partition(' ')) 
+1

Le trait de soulignement comme nom de variable est vraiment cool! Quel truc sympa! :-) –

+0

vous ne pouvez pas avoir ce genre de syntaxe «générique». – SilentGhost

+1

Notez que _ est souvent utilisé par gettext, donc vous ne voudrez peut-être pas le faire. –

2

Je pense qu'une question que j'ai posée il y a un certain temps pourrait vous aider:

Pythonic way to get some rows of a matrix

NumPy vous donne la syntaxe de tranche que vous souhaitez extraire divers éléments en utilisant un tuple ou une liste d'indices, mais je ne pense pas que vous voulez vous convertir liste de chaînes à un numpy.array juste pour extraire quelques éléments, vous pourriez peut-être écrire un assistant:

def extract(lst, *indices): 
    return [lst[i] for i in indices] 

item0, item2 = extract(str.partition(' '), 0, 2) 
+0

C'est un bonne alternative aussi. Merci d'avoir partagé! :-) –

4

Corriger, vous ne pouvez pas prendre plusieurs éléments ad hoc sur une liste de tuple en une seule fois.

part0, part1, part2 = str.partition(' ') 

C'est le chemin à parcourir. Ne vous inquiétez pas de part1, si vous n'en avez pas besoin, vous n'en avez pas besoin. Il est courant de l'appeler «factice» ou «inutilisé» pour montrer qu'il n'est pas utilisé.

Vous pouvez être laid avec:

part0, part2 = str.partition(' ')[::2] 

Dans ce cas précis, mais c'est obscurcissant et pas gentil envers les autres. ;)

1

vous pouvez également utiliser str.split(' ', 1) au lieu de str.partition(' ')

vous récupérerez une liste au lieu d'un tuple, mais vous ne serez pas le séparateur arrière

+0

et ce sera chien-lent – SilentGhost

0

Voilà comment je le ferais:

all_parts = str.partition(' ') 
part0, part2 = all_parts[0], all_parts[2] 
Questions connexes