Python 什么';解析变长字符串中的值的最佳方法是什么?

Python 什么';解析变长字符串中的值的最佳方法是什么?,python,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 有没有更有效的方法 defaults=[10,10,1] mylist=[int(x) for

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

目前,我有以下几点

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=[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内置函数的名称,因此您将删除对该函数的轻松访问。

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

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

我认为这是丑陋的原因,因为它不是Pythonic来处理局部变量的集合;实例成员更合适。

您可以使用助手函数:

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)


在任何人把它当作傻瓜关上之前;请注意,OP现在希望使用默认值。这是@idealistikz的后续内容:就您的要求而言,代码在我看来足够有效。我想不出任何方法来提高您的操作速度。你能提供一个上下文或者更多的代码吗?这比原来的方法更有效吗?@idelliatikz——以什么方式更有效?计算速度?我不知道。您可以使用
timeit
对其计时。如果listcomp中的x为空输入,则需要
进行计时。@astynax:如果
len(mylist)>3
引发异常是一项功能,而不是一个bug。
>>> 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)