2017-05-05 14 views
1

リストを含むメソッド内でいくつかの値を返したいと思います。返り値でリストの一部を取得する方法

def foo(): 
    a = 42 
    b = [1,2] 
    return a, b 

aa, b_list = foo()  
aa, (b1, b2) = foo() 

しかし、私は最初の要素なしのリストを取得する方法がわからない:

後は正常に動作します

def bar(): 
    a = 42 
    b = [1,2,3] 
    return a, b 

aa, (_, b_list) = bar() 
print(b_list) # Expecting [2,3] 
# ValueError: too many values to unpack (expected 2) 

はい、私はリストを取得し、最初の要素をドロップすることができますが、そこにありますこれのための1つのライナー?

この関数は、2つのシナリオサポートされるべきである、例えば、多用途であると考えられる。

aa, whole_list = foo() 
aa, first_elem, rest_of_the_list = foo() 
+0

これは機能をアンパックする方法の詳細です。開始とタプルアンパックを見てください。例: 'aa、lst = foo()'または 'aa、(first、* rest)= foo()'はPython 3で動作するはずです。 – pylang

+0

@pylangは 'aa、first、* rest = foo()'は動作していません。 '()'を追加する必要があります – Deqing

+1

アップデートをご覧ください。 – pylang

答えて

5

はい、あります。

aa, (_, *b_list) = bar() 
  • 注これが唯一の3
+0

Pythonのどのバージョンがその構文を受け入れますか? – helloV

+0

@helloV私のマシン上でPython v3.5.2で動作することを確認できます。 –

1

これはlist slice呼ばれると、

return a, b[1:] 

この表記法は、要素1から最後まで、つまり最初の要素を除いてすべてを返します。

あなただけの同じ構文を使用し、復帰後の最初のアイテムをドロップする必要がある場合:(次の割り当てまで)

print(b_list[1:]) 

または恒久的に変更をb_list

b_list = b_list[1:] 
+0

ありがとうございます、これは動作しているはずです。私の質問を更新しました。 – Deqing

+0

質問はどのように戻り値を処理するか、戻り値を変更する方法ではありません。 – helloV

+0

@ウリエル私は最初に質問を明確にすべきだった。 – Deqing

-1

とそう何から私はあなたが戻って42であるバックを取得したいと理解しています1,2,3

私は試してみます

def bar(): 
    a = 42 
    b = [1,2,3] 
    return a, b 

a, b = bar() 
print(b) # Expecting [2,3] 
print(aa) 
1

ないのpython正確に一つのライナーで動作しますが、私はの性質を作るためにnamedtupleを使用して試してみた:あなたはb_listのため開梱使用することができますリテラルクリアー

from collections import namedtuple 
retval = namedtuple('retval', 'scalar list') 

def bar(): 
    a = 42 
    b = [1,2,3] 
    return retval(a, b) 

rv = bar() 
a, b = rv.scalar, rv.list[1:] 
関連する問題