2012-07-03 61 views
2

假设我有一串由可变长度的逗号分隔的整数。如果分隔字符串和使用值更新变量(如果它们存在),最好的方法是什么?从可变长度字符串解析值的最佳方法是什么?

目前,我有以下几点。

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 

有没有更有效的方法呢?

+0

之前;请注意,OP现在要使用默认值。 –

+0

这是[在Python中将可变长度字符串拆分为变量的最佳方法是什么?](http://stackoverflow.com/questions/11313256/what-is-the-best-way-to -split-a-variable-length-string-into-variables-in-python) –

+0

@idealistikz:对于你所要求的,代码是足够高效的IMO。我想不出一种方法来提高你正在做的事情的速度。你能提供一个上下文还是更多的代码? –

回答

5
a, b, c = 10, 10, 1 #default values 
mylist = [int(x) for x in input.split(',')] 
a, b, c = mylist + [a, b, c][len(mylist):] 

我认为这是丑陋的原因是,它是不符合Python在总治疗局部变量;实例成员会更合适。

+0

你需要在listcomp中有'if x'作为空输入。 – jfs

+0

@astynax:如果'len(mylist)> 3'是一个功能而不是bug,则引发异常。 – jfs

1
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的名称,因此您可以轻松访问该功能。

+0

这比原来的方法更有效吗? – idealistikz

+0

@idealistikz - 以什么方式提高效率?计算速度?我不知道。你可以用'timeit'来计时。 – mgilson

1

使用切片到用户输入与默认的参数列表相结合:

>>> 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 
3

你可以使用一个辅助功能:

def f(a=10, b=10, c=1): 
    return a, b, c 

a, b, c = f(*map(int, input.split())) 

这会不会是快 - 它只是用不同的方式来做到这一点,仅仅越过我的脑海。

0

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) 
0
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) 
相关问题