如何用逗号分隔字符串中的零替换空字符串?
“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 ....... .. 我试过但没有成功,帮助表示赞赏,谢谢。
您可以使用
[(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。
感谢您的帮助,它非常清楚您和Dietrich Epp解释它的方式。 – Kev 2010-04-09 12:39:11
正则表达式在Python中通常是不必要的。鉴于串s
,尝试:
','.join(x or '0' for x in s.split(','))
我假设你想如果你想的整数,而不是字符串列表以0来填补空白,试试这个:
[(x and int(x)) or 0 for x in s.split(',')]
>>> 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]
>>>
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
哇,这是疯了,你的天才伙计。 – Kev 2010-04-09 12:11:13
我同意这个“疯狂”的部分:我喜欢尝试编写这些reges以测试我的技能,但对于真正的程序,我宁愿使用其中一个解决方案发布在这里;-) – 2010-04-09 12:15:46
我能想到的最简单的是
[int(x or 0) for x in s.split(',')]
或
[int('0'+x) for x in s.split(',')]
我的解决方案使用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]
。
有趣的问题和很棒的机会写出真正的惯用Python。 – 2012-01-19 00:54:02