0

わかりました。3つの値を含むタプルのリストがあります。(code, value, unit)

これを使用するときは、値がstr、list、またはmatrixのいずれであるかを確認する必要があります。(またはリストかどうかを確認してから、もう一度リストかどうかを確認してください)

私の質問は、単に私がこのようにすべきか、それとももっと良い方法がありますか?

for code, value, unit in tuples:
    if isinstance(value, str): 
        # Do for this item
    elif isinstance(value, collections.Iterable):
        # Do for each item
        for x in value:
             if isinstance(x, str):
                  # Do for this item
             elif isinstance(x, collections.Iterable):
                  # Do for each item
                  for x in value:
                      # ...
             else:
                  raise Exception
    else:
        raise Exception
4

5 に答える 5

3

str最善の解決策は、このようなタイプの混合を避けることですが、それで行き詰まっている場合は、インスタンスのみをチェックすることを除けば、あなたが書いたものは問題ありません。文字列でもイテラブルでもない場合は、より適切な例外が発生するため、自分で行う必要はありません。

for (code,value,unit) in tuples:
    if isinstance(value,str): 
        #Do for this item
    else:
        #Do for each item
        for x in value:
             if isinstance(value,str):
                  #Do for this item
             else:
                  #Do for each item
                  for x in value:
于 2012-07-23T12:28:48.003 に答える
2

あなたのアプローチの代替案は、このコードをより一般的なジェネレーター関数に分解することです(Python 2.xを想定):

def flatten(x):
    if isinstance(x, basestring):
        yield x
    else:
        for y in x:
            for z in flatten(y):
                yield y

(これには、 Duncanの回答で提案および説明されている簡略化も組み込まれています。)

これで、コードは非常にシンプルで読みやすくなります。

for code, value, unit in tuples:
    for v in flatten(value):
        # whatever

コードを因数分解すると、コード内のいくつかの場所でこのデータ構造を処理するのにも役立ちます。

于 2012-07-23T12:33:31.523 に答える
2

これは機能しますが、 を呼び出すたびに、 「代わりに にisinstanceメソッドを追加できますか?」と自問する必要があります。valueこれにより、コードは次のように変更されます。

for (code,value,unit) in tuples:
    value.doSomething(code, unit)

strこれが機能するには、実装するヘルパー型で や リストのような型をラップする必要がありますdoSomething()

于 2012-07-23T12:28:00.243 に答える
1

タプルを使用して例外をキャッチするだけです。ジャンプする前に見ないでください:)

于 2012-07-23T12:28:05.827 に答える
0

再帰が役立ちます。

def processvalue(value):
  if isinstance(value, list): # string is type Iterable (thanks @sven)
    for x in value:
      processvalue(value)
  else:
    # Do your processing of string or matrices or whatever.


# Test each the value in each tuple.
for (code, value, unit) in tuples:
  processvalue(value)

これは、ネストされた構造を処理するためのより適切な方法であり、任意の深さを処理する機能も提供します。

于 2012-07-23T12:36:25.970 に答える