从可变长度字符串中解析值的最佳方法是什么?

时间:2012-07-03 15:36:15

标签: python

假设我有一个由可变长度的逗号分隔的整数字符串。拆分字符串并使用值更新变量的最佳方法是什么?

目前,我有以下内容。

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

有更有效的方法吗?

6 个答案:

答案 0 :(得分: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):]

我认为这个丑陋的原因是,聚合物处理局部变量是非Pythonic的;实例成员会更合适。

答案 1 :(得分:3)

您可以使用辅助功能:

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

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

这不会更快 - 这只是一种不同的方式来实现它只是在我脑海中。

答案 2 :(得分: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的名称,因此您可以轻松访问该功能。

答案 3 :(得分: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

答案 4 :(得分: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)

答案 5 :(得分: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)