2010-01-25 5 views

Répondre

21

Je pense que vous cherchez operator.itemgetter:

import operator 
line=','.join(map(str,range(11))) 
print(line) 
# 0,1,2,3,4,5,6,7,8,9,10 
alist=line.split(',') 
print(alist) 
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] 
one,four,ten=operator.itemgetter(1,4,10)(alist) 
print(one,four,ten) 
# ('1', '4', '10') 
+2

Ceci est beaucoup de code ... –

+6

Pas vraiment. Si vous sortez le code démonstratif, il peut ressembler à ceci: un, quatre, dix = operator.itemgetter (1,4,10) (ligne.split (',')) –

+0

Vous êtes un sauveteur, merci! Si le temps est correct, cela devrait réduire le temps d'exécution d'un code de code que nous avons examiné aujourd'hui de 9 heures à quelques secondes. –

8
lst = line.split(',') 
one, four, ten = lst[1], lst[4], lst[10] 
+2

Je pense que vous avez mal compris la question –

+0

@Idan: peut-être que je suis, je ne suis pas censé obtenir les 2e, 5e et 11e éléments de la nouvelle liste? – SilentGhost

+1

@Idan K: Il n'y a aucune exigence que la version "Pythonic" soit une seule expression comme la version Perl. –

1

Oui:

data = line.split(',') 
one, four, ten = data[1], data[4], data[10] 

Vous pouvez également utiliser itemgetter, mais je préfère le code ci-dessus, c'est plus clair, et la clarté == bon code.

4

Essayez operator.itemgetter (disponible en python 2.4 ou plus récent): méthode

Retourner un objet appelable qui va chercher un objet à partir de son opérande en utilisant ____ ____ getitem() de l'opérande. Si plusieurs éléments sont spécifiés, renvoie un nombre de valeurs de recherche.

>>> from operator import itemgetter 
>>> line = ','.join(map(str, range(11))) 
>>> line 
'0,1,2,3,4,5,6,7,8,9,10' 
>>> a, b, c = itemgetter(1, 4, 10)(line.split(',')) 
>>> a, b, c 
('1', '4', '10') 

condensé:

>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10] 
>>> from operator import itemgetter 
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(',')) 
+0

La bonne importation est 'd'opérateur importgetgetget'' –

+0

thx, édité ... – miku

+0

Vous êtes un sauveteur, merci! Si le temps est correct, cela devrait réduire le temps d'exécution d'un code de code que nous avons examiné aujourd'hui de 9 heures à quelques secondes. –

18

En utilisant une compréhension de la liste

line = '0,1,2,3,4,5,6,7,8,9,10' 
lst = line.split(',') 
one, four, ten = [lst[i] for i in [1,4,10]] 
+1

Il s'agit d'une [liste de compréhension] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), pas de compression de liste. – Bengt

+1

Corrigé. vivre longtemps. – has2k1

2

Que diriez-vous ceci:

index = [1, 0, 0, 1, 0] 
x = [1, 2, 3, 4, 5] 
[i for j, i in enumerate(x) if index[j] == 1] 
#[1, 4] 
0

Sinon, si vous aviez un tableau numpy au lieu d'une liste, vous pouvez faire womething comme:

from numpy import array 

# Assuming line = "0,1,2,3,4,5,6,7,8,9,10" 
line_array = array(line.split(",")) 

one, four, ten = line_array[[1,4,10]] 

L'astuce ici est que vous pouvez passer une liste (ou un tableau numpy) sous forme d'indices de tableau. J'ai d'abord pensé que cela fonctionnerait aussi avec les tuples, mais c'est un peu plus compliqué. Je suggère de rester avec des listes ou des tableaux.

Questions connexes