2010-04-09 2 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 ,,,, ,, 1,7,6 ,,,, 8,, 5 ,,, 7,1,, 3,9, "Как заменить пустую строку нулевым символом в запятой?

Я занимаюсь программированием, когда мне нужно разобрать эту последовательность в моем скрипте судоку , Необходимо получить вышеуказанную последовательность в 8,5,0,1,4,7,0,0,0,7,0,1,9,3,6,0,0,8 ....... .. Я пробовал повторно, но безуспешно, помощь приветствуется, спасибо.

+0

Веселый вопрос и отличная возможность написать действительно идиоматический Python. –

ответ

8

Вы можете использовать

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

data.split(',') разбивает строку в списке. Он разбивает на запятая:

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

Выражение

(int(x) if x else 0) 

возвращает int(x) если x верно, 0, если x ложна. Обратите внимание, что пустая строка - False.

+0

Спасибо за помощь, это действительно ясно, как вы и Дитрих Эпп объяснили это. – Kev

4

Регулярные выражения часто не нужны в Python. Учитывая строку s, попробуйте:

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

Я предполагаю, что вы хотите, чтобы заполнить пробелы с 0. Если вы хотите получить список целых чисел вместо строки, попробуйте следующее:

[(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 

Печать:

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

Ничего себе, безумный, твой гениальный чувак. – Kev

+2

Я согласен с «безумной» частью: мне нравится писать эти регенты, чтобы проверить свои навыки, но для реальных программ я бы предпочел использовать одно из других решений, размещенных здесь ;-) –

0

Простейшее Я могу думать о

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

или

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

Мое решение использует map, lambda и split. Окончательный код выглядит следующим образом:

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

Если вы хотите, чтобы вывод в виде списка (т.е. [1,2,3,0,4,5,0,6]), а затем использовать

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

Команды map и lambda очень полезны. map берет функцию и список (действительно повторяемый, но это уже другая история) и применяет эту функцию к каждому элементу этого списка. Таким образом,

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

[2,3,4,5].lambda способ быстро определить функции, так что мы можем написать plus_one, как

lambda x: x+1 

Наконец, split принимает строку и создает список по «расщеплению» строки по аргументу вы проходите. Таким образом, "1 2 3 4".split(" ") дает [1,2,3,4].