pla*_*etp 74 python string split python-3.x
在Perl我能做到:
my ($x, $y) = split /:/, $str;
Run Code Online (Sandbox Code Playgroud)
无论字符串是否包含模式,它都将起作用.
在Python中,但这不起作用:
a, b = "foo".split(":") # ValueError: not enough values to unpack
Run Code Online (Sandbox Code Playgroud)
在这种情况下防止错误的规范方法是什么?
Eug*_*ash 110
如果你只分成两个部分(比如在你的例子中),你可以str.partition()
用来获得一个保证参数解包大小为3:
>>> a, sep, b = 'foo'.partition(':')
>>> a, sep, b
('foo', '', '')
Run Code Online (Sandbox Code Playgroud)
str.partition()
无论是否找到分隔符,始终返回3元组.
Python 3.x的另一个替代方法是使用扩展的可迭代解包:
>>> a, *b = 'foo'.split(':')
>>> a, b
('foo', [])
Run Code Online (Sandbox Code Playgroud)
这会将第一个拆分项目a
和剩余项目列表(如果有)分配给b
.
cda*_*rke 59
由于您使用的是Python 3,因此很容易.在分配给元组时,PEP 3132引入了对语法的欢迎简化 - 扩展的可迭代解包.过去,如果赋值给元组中的变量,则赋值左侧的项目数必须与右侧的项目完全相等.
在Python 3中,我们可以通过在星号*前面添加前缀,将左侧的任何变量指定为列表.这将尽可能多地获取值,同时仍然将变量填充到其右侧(因此它不必是最右边的项目).当我们不知道元组的长度时,这避免了许多讨厌的切片.
a, *b = "foo".split(":")
print("a:", a, "b:", b)
Run Code Online (Sandbox Code Playgroud)
得到:
a: foo b: []
Run Code Online (Sandbox Code Playgroud)
编辑后评论和讨论:
与Perl版本相比,这是相当不同的,但它是Python(3)方式.与Perl版本相比,re.split()
会更加相似,但是调用RE引擎来分割单个字符是一种不必要的开销.
使用Python中的多个元素:
s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)
Run Code Online (Sandbox Code Playgroud)
得到:
a: hello b: ['world', 'sailor']
Run Code Online (Sandbox Code Playgroud)
但是在Perl中:
my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";
Run Code Online (Sandbox Code Playgroud)
得到:
a: hello b: world
Run Code Online (Sandbox Code Playgroud)
可以看出,在Perl中忽略或丢失了其他元素.如果需要,这在Python中很容易复制:
s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)
Run Code Online (Sandbox Code Playgroud)
所以,a, *b = s.split(":")
Perl中的等价物就是
my ($a, @b) = split /:/, $s;
Run Code Online (Sandbox Code Playgroud)
注意:我们不应该使用$a
和$b
一般的Perl,因为当用于他们有特殊的意义sort
.我在这里使用它们与Python示例保持一致.
Python确实有一个额外的技巧,我们可以解压缩到左边的元组中的任何元素:
s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)
Run Code Online (Sandbox Code Playgroud)
得到:
a: one b: ['two', 'three'] c: four
Run Code Online (Sandbox Code Playgroud)
而在Perl等价物中,array(@b
)是贪婪的,标量$c
是undef
:
use strict;
use warnings;
my $s = 'one:two:three:four';
my ($a, @b, $c) = split /:/, $s;
print "a: $a b: @b c: $c\n";
Run Code Online (Sandbox Code Playgroud)
得到:
Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c:
Run Code Online (Sandbox Code Playgroud)
Phi*_*tin 21
您总是可以自由地捕获异常.
例如:
some_string = "foo"
try:
a, b = some_string.split(":")
except ValueError:
a = some_string
b = ""
Run Code Online (Sandbox Code Playgroud)
如果将整个原始字符串分配给a
空字符串b
是所需的行为,我可能会使用str.partition()
eugene y建议.但是,此解决方案可让您更准确地控制字符串中没有分隔符时发生的情况,这在某些情况下可能很有用.
Aar*_*hif 17
split
将始终返回一个列表.a, b = ...
总是希望列表长度为2.你可以使用类似的东西l = string.split(':'); a = l[0]; ...
.
这是一个班轮: a, b = (string.split(':') + [None]*2)[:2]
归档时间: |
|
查看次数: |
6590 次 |
最近记录: |