如何处理分割中的缺失数据?
我想把一个字符串分开,但有些部分可能缺失。比如,"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
但我在想,这是不是最“符合Python风格”的做法。
3 个回答
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']]
2
对于这个具体的例子,我会使用 partition
方法。
>>> 'foo-bar'.partition('-')
('foo', '-', 'bar')
>>> 'foobar'.partition('-')
('foobar', '', '')
>>> 'foo-bar-baz'.partition('-')
('foo', '-', 'bar-baz')
对于一般情况,如果要分割的部分不止一个,但数量是已知的,我通常会检查 split
的结果长度。不过,Martijn说得没错,如果字符串中缺少分隔符的情况不常见,捕获异常也是可以的,可能是更好的选择。
3
捕获异常:
try:
foo, bar = line.split('-', 1)
except ValueError:
# not enough values
foo, bar = line, None
注意,你只需要分割一次,就能得到两个值,而不是分割两次。