0

このようなことを行うことは可能ですか:

def f():
  d={}
  d[1]='qwe'
  d[2]='rty'
  return d

a,b=f()[1:2]

a,b=f()[1],f()[2] ではない

t=f()
a,b=t[1],t[2]

余分な行を避けて、関数を 1 回だけ呼び出します。

4

3 に答える 3

2

あなたが何をしたいのか正確にはわかりません。整数で辞書にインデックスを付けています。整数は辞書のキーとして問題なく使用できますが、あなたの場合はリストの方が理にかなっているように見えます。辞書とリストの重要な違いは、辞書が順序付けされていないことです。あなたの例では、必ずしも1位と2位になるd[1]とは限りません。d[2]したがって、順序に依存する場合、標準の辞書はとにかく機能しません (OrderedDictそうなるでしょう)。

(データ構造が関数によって返されるという事実は、f()ここでは何の違いもないので、読みやすくするために無視します)

あなたが得た場合

lst = ['qwe', 'rty']

あなたは簡単に行うことができます

a, b = lst

、およびlst[0]に割り当てます。リストはスライスすることもできます:alst[1]b

long_lst = range(1000)
a, b = long_lst[500:502]

実際に辞書を使用たい場合は、次のようにそのコンポーネントにアクセスできます。

>>> d = {'a': 'AAA', 'b': 'BBB'}
>>> d.keys()
['a', 'b']
>>> d.values()
['AAA', 'BBB']
>>> d.items()
[('a', 'AAA'), ('b', 'BBB')]

ただし、前述のように、この例でたまたま正しい順序になっている場合でも、辞書の順序に依存することはできません。辞書の順序は時間の経過とともに変化します。

于 2012-10-06T16:28:39.297 に答える
1

いいえ; 辞書の索引付けは、通常、辞書のキーでは意味をなさないため、スライスをサポートしていません。

ただし、次のようなものを使用して、自分でロールすることができます

a, b = map(f().get, [1, 2])

または(@DSMに感謝)

a, b = operator.itemgetter(1, 2)(f())

これらは、の結果f()が欠落している場合、1または2キーとしての場合、最初の結果がデフォルトで割り当てNoneになり、2番目の結果がレイズするという点でわずかに異なりますKeyError。おそらく少し遅くなりますが、map(f().__getitem__, ...)と同等である必要があります。itemgetter

于 2012-10-06T16:22:57.163 に答える
1

はい、メソッドを使用してdict.values()ください:

x,y = f().values()[0:2]
于 2012-10-06T16:25:24.220 に答える