2010-04-09 28 views
4

"8,5,, 1,4,7", 7,, 1,9,3,6 ", 8,6,3,9, 2,5,4 ,,,,, 3 , 2 ,,, 7,4,1,1,, 4, 6,9, 5, 5, 1, 6,3, 6,5, 7,4 "Je fais un défi de programmation où je dois analyser cette séquence dans mon script de sudoku . Besoin d'obtenir la séquence ci-dessus en 8,5,0,1,4,7,0,0,0,7,0,1,9,3,6,0,0,8 ....... .. J'ai essayé re mais sans succès, l'aide est appréciée, merci.Comment remplacer une chaîne vide par zéro dans une chaîne séparée par des virgules?

+0

Question amusante et excellente occasion d'écrire vraiment Python idiomatique. –

Répondre

8

vous pouvez utiliser

[(int(x) if x else 0) for x in data.split(',')] 

data.split(',') divise la chaîne dans une liste. Il se divise sur la virgule:

['8', '5', '', '1', '4', '7', '', '', '', ...] 

L'expression

(int(x) if x else 0) 

retours int(x) si x est vrai, 0 si x est faux. Notez que la chaîne vide est False.

+0

Merci pour l'aide, c'est vraiment clair comme vous et Dietrich Epp l'ont expliqué. – Kev

4

Les expressions régulières sont souvent inutiles dans Python. Compte tenu de la chaîne s, essayez:

','.join(x or '0' for x in s.split(',')) 

Je suppose que vous voulez remplir les blancs avec 0. Si vous voulez une liste d'entiers au lieu d'une chaîne, essayez ceci:

[(x and int(x)) or 0 for x in s.split(',')] 
0
>>> s="8,5,,1,4,7,,,,7,,1,9,3,6,,,8,6,3,9,,2,5,4,,,,,3,2,,,7,4,1,1,,4,,6,9,,5,,,,5,,,1,,6,3,,,6,5,,,,7,4,,1,7,6,,,,8,,5,,,7,1,,3,9," 
>>> s=s.split(",") 
>>> for n,i in enumerate(s): 
...  if i=="" : s[n]=0 
... 
>>> s 
['8', '5', 0, '1', '4', '7', 0, 0, 0, '7', 0, '1', '9', '3', '6', 0, 0, '8', '6', '3', '9', 0, '2', '5', '4', 0, 0, 0, 0, '3', '2', 0, 0, '7', '4', '1', '1', 0, '4', 0, '6', '9', 0, '5', 0, 0, 0, '5', 0, 0, '1', 0, '6', '3', 0, 0, '6', '5', 0, 0, 0, '7', '4', 0, '1', '7', '6', 0, 0, 0, '8', 0, '5', 0, 0, '7', '1', 0, '3', '9', 0] 
>>> 
3
s = "8,5,,1,4,7,,,,7,,1,9,3,6,,,8,6,3,9,,2,5,4,,,,,3,2,,,7,4,1,1,,4,,6,9,,5,,,,5,,,1,,6,3,,,6,5,,,,7,4,,1,7,6,,,,8,,5,,,7,1,,3,9," 
s = re.sub('((?<=,)|^)(?=,|$)', '0', s) 
print s 

Prints:

8,5,0,1,4,7,0,0,0,7,0,1,9,3,6,0,0,8,6,3,9,0,2,5,4,0,0,0,0,3,2,0,0,7,4,1,1,0,4,0,6,9,0,5,0,0,0,5,0,0,1,0,6,3,0,0,6,5,0,0,0,7,4,0,1,7,6,0,0,0,8,0,5,0,0,7,1,0,3,9,0

+0

Wow c'est fou, votre mec génie. – Kev

+2

Je suis d'accord avec la partie "folle": j'aime essayer d'écrire ces reges afin de tester mes compétences, mais pour de vrais programmes, je préfère utiliser l'une des autres solutions postées ici ;-) –

0

Je pense Simplest représente:

[int(x or 0) for x in s.split(',')] 

ou

[int('0'+x) for x in s.split(',')] 
0

Ma solution utilise map, lambda et split. Le code final ressemble à ceci:

sudoku_string = "1,2,3,,4,5,,6" 
output_string = map(lambda x: '0' if x=='' else x, sudoku_string.split(",")) 

Si vous voulez que la sortie sous forme de liste (à savoir [1,2,3,0,4,5,0,6]), puis utilisez

output_list = map(lambda x: 0 if x=='' else int(x), sudoku_string.split(",") 

Les commandes map et lambda sont très utiles. map prend dans une fonction et une liste (vraiment une itérable, mais c'est une autre histoire), et applique la fonction à chaque élément de cette liste. Ainsi,

def plus_one(x): 
    return x+1 
map(plus_one, [1,2,3,4]) 

renvoie [2,3,4,5].lambda est un moyen de définir rapidement les fonctions, de sorte que nous pouvons écrire plus_one comme

lambda x: x+1 

Enfin, split prend une chaîne et crée une liste par « division » de la chaîne par l'argument que vous passez. Donc "1 2 3 4".split(" ") donne [1,2,3,4].

Questions connexes