0

次の形式のタプルを解析しようとしています。

a=(1,2)

また

b=((1,2), (3,4)...)

a の場合、コードは次のようになります。

x, y = a

b は次のようになります。

for element in b:
    x, y = element

両方のフォームを受け入れるための迅速でクリーンな方法はありますか? これは MIDI 受信コールバックにあります (x は実行する関数へのポインタで、y はライトに渡される強度データです)。

4

2 に答える 2

2
# If your input is in in_seq...
if hasattr(in_seq[0], "__iter__"):
    # b case
else:
    # a case

これは基本的に、入力シーケンスの最初の要素が反復可能かどうかを確認します。そうであれば、それはあなたの2番目のケースです(タプルは反復可能であるため)、そうでなければ、それはあなたの最初のケースです。

入力がタプルになることが確実にわかっている場合は、代わりにこれを使用できます。

if isinstance(in_seq[0], tuple):
    # b case
else:
    # a case

やりたいことに応じて、「a」ケースの処理は、単一のタプルをより大きなタプル内にバンドルし、「b」ケースと同じコードを呼び出すのと同じくらい簡単になる可能性があります。

b_case = (a_case,)

編集:コメントで指摘されているように、より良いバージョンは...

from collections import Iterable
if isinstance(in_seq[0], Iterable):
    # ...
于 2012-08-19T04:17:29.287 に答える
1

それを行う正しい方法は次のとおりです。

a = ((1,2),) # note the difference
b = ((1,2), (3,4), ...)

for pointer, intensity in a:
   pass # here you do what you want
于 2012-08-19T04:17:10.970 に答える