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

これを行うためのより効率的な方法はありますか?

4

6 に答える 6

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だからだと思います。インスタンスメンバーの方が適切です。

于 2012-07-03T15:49:10.933 に答える
3

ヘルパー関数を使用できます。

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

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

これは速くなることはありません-それはちょうど私の頭をよぎったそれを行うための別の方法です。

于 2012-07-03T15:54:39.493 に答える
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
于 2012-07-03T15:47:55.257 に答える
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組み込みの名前なので、その関数への簡単なアクセスを削除します。

于 2012-07-03T15:40:03.463 に答える
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)
于 2012-07-03T15:58:47.720 に答える
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)
于 2012-07-03T16:21:35.140 に答える