2010-04-09 84 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。 – 2012-01-19 00:54:02

回答

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

感謝您的幫助,它非常清楚您和Dietrich Epp解釋它的方式。 – Kev 2010-04-09 12:39:11

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 2010-04-09 12:11:13

+2

我同意這個「瘋狂」的部分:我喜歡嘗試編寫這些reges以測試我的技能,但對於真正的程序,我寧願使用其中一個解決方案發布在這裏;-) – 2010-04-09 12:15:46

0

我能想到的最簡單的是

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

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

我的解決方案使用maplambdasplit。最終的代碼如下所示:

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(",") 

命令maplambda是非常有用的。 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]