如何处理分割中的缺失数据?

1 投票
3 回答
1212 浏览
提问于 2025-04-21 03:11

我想把一个字符串分开,但有些部分可能缺失。比如,"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

注意,你只需要分割一次,就能得到两个值,而不是分割两次。

撰写回答