假设我有一串由可变长度的逗号分隔的整数。如果分隔字符串和使用值更新变量(如果它们存在),最好的方法是什么?从可变长度字符串解析值的最佳方法是什么?
目前,我有以下几点。
a, b, c = 10, 10, 1 #default values
mylist = [int(x) for x in input.split(',')]
if len(mylist) == 2: a, b = mylist
else: a, b, c = mylist
有没有更有效的方法呢?
假设我有一串由可变长度的逗号分隔的整数。如果分隔字符串和使用值更新变量(如果它们存在),最好的方法是什么?从可变长度字符串解析值的最佳方法是什么?
目前,我有以下几点。
a, b, c = 10, 10, 1 #default values
mylist = [int(x) for x in input.split(',')]
if len(mylist) == 2: a, b = mylist
else: a, b, c = mylist
有没有更有效的方法呢?
defaults=[10,10,1]
mylist=[int(x) for x in ipt.split(',')]
defaults[:len(mylist)]=mylist
a,b,c=defaults
这改变defaults
虽然...你避免这种情况,像这样的工作:
defaults=[10,10,1]
mylist=[int(x) for x in ipt.split(',')]
temp_defaults=defaults[:]
temp_defaults[:len(mylist)]=mylist
a,b,c=temp_defaults
此外,使用input
作为变量名要小心。它是内置python的名称,因此您可以轻松访问该功能。
这比原来的方法更有效吗? – idealistikz
@idealistikz - 以什么方式提高效率?计算速度?我不知道。你可以用'timeit'来计时。 – mgilson
使用切片到用户输入与默认的参数列表相结合:
>>> defaults = [10, 10, 1]
>>> user_input = '15 20'
>>> user_ints = map(int, user_input.split())
>>> combined = user_ints + defaults[len(user_ints):]
>>> a, b, c = combined
你可以使用一个辅助功能:
def f(a=10, b=10, c=1):
return a, b, c
a, b, c = f(*map(int, input.split()))
这会不会是快 - 它只是用不同的方式来做到这一点,仅仅越过我的脑海。
izip_longest
允许采用默认值的长度,如果较长的:任何人都关闭此作为欺骗
>>> from itertools import izip_longest
>>> inp = '3, 56'
>>> a, b, c = [i if i else j for i, j in izip_longest([int(x) for x in inp.split(',')], (10, 10, 1))]
>>> a, b, c
(3, 56, 1)
a, b, c = (map(int, user_input.split(',')) + [20,20,10])[:3]
或
def parse(user_input, *args):
return (map(int, user_input.split(',')) + list(args))[:len(args)]
>>> a, b, c = parse('1,2', 20, 20, 10)
>>> a, b, c
(1, 2, 20)
>>> a, b, c, d = parse('1,2,3,4,5', 0, 0, 0, 0)
>>> a, b, c, d
(1, 2, 3, 4)
之前;请注意,OP现在要使用默认值。 –
这是[在Python中将可变长度字符串拆分为变量的最佳方法是什么?](http://stackoverflow.com/questions/11313256/what-is-the-best-way-to -split-a-variable-length-string-into-variables-in-python) –
@idealistikz:对于你所要求的,代码是足够高效的IMO。我想不出一种方法来提高你正在做的事情的速度。你能提供一个上下文还是更多的代码? –