我想拆分一个可能缺少部件的字符串。
例如,"foo-bar"
应分为"foo"
和"bar"
,"zot"
分为"zot"
和None
。
foo,bar = line.split('-',1)
适用于第一种情况,但不适用于第二种情况:
ValueError: need more than 1 value to unpack
当然,我可以走得很远:
foobar = line.split('-',1)
if len(foobar) == 2:
foo,bar = foobar
else:
foo,bar = foobar[0],None
但我想知道这是否是最“pythonic”的方式。
答案 0 :(得分:3)
抓住例外:
try:
foo, bar = line.split('-', 1)
except ValueError:
# not enough values
foo, bar = line, None
请注意,您需要拆分一次才能获得两个值,而不是两次。
答案 1 :(得分:2)
对于这个确切示例,我使用partition
方法。
>>> 'foo-bar'.partition('-')
('foo', '-', 'bar')
>>> 'foobar'.partition('-')
('foobar', '', '')
>>> 'foo-bar-baz'.partition('-')
('foo', '-', 'bar-baz')
对于有多个分割,但仍然是已知数字的一般情况,我通常会检查split
的结果长度,但Martijn(不出所料)正确地捕获异常很好,如果缺少分隔符的字符串不常见,则可能是更好的选择。
答案 2 :(得分:0)
使用列表理解:
i=['ff-bb','cc','dd-ss-vv']
[string+[None] if len(string)==1 else string for string in [x.split('-') for x in i]]
返回
[['ff', 'bb'], ['cc', None], ['dd', 'ss', 'vv']]