3

次の仮定の状況を考えてみましょう。

Pythonで開発しているアプリケーションの一部として、オブジェクトのリストをフォーマットし、後続の各アイテムを指定されたキーワードにタプルとして割り当てる必要があります。構文は次のとおりです。

entries = [keyword, [obj1, obj2, obj3, ...]]    # Original list of object entries

formatted = [(keyword, obj1), (keyword, obj2), (keyword, obj3), ...]

これがあなたが提案する関数です(これがより効率的であるかどうか私に知らせてください):

def format(keyword, entries):
    return [(keyword, x) for x in entries[1][0]]

適用される関数は次のとおりです。

foo = format(entries[0], entries[1])

柔軟性に関する質問

entries関数内の変数にformatは静的インデックス整数1とが含まれていることに注意してください0。新しい用語がentriesリストに追加される可能性があると予想するとします。通常、定数の代わりにインデックス変数を使用しますか(リストに追加される後のアイテムの定数をインクリメントすることを期待します)、その場合、ローカルまたはグローバルインデックスを使用しますか?コードでこの種の柔軟性をどのように説明しますか?

4

2 に答える 2

4

関数にキーワードと1次元リストを渡します。なぜ関数定義のインデックスを気にするのですか?書かれているように私は得る。

e = ['spam', ['aa','bb','cc','dd']]

def format(keyword, entries):
    return [(keyword, x) for x in entries[1][0]]

format(e[0], e[1])
[('spam', 'b')]

オブジェクトが何であるかによっては、インデックスエラーが発生する場合があります。関数内にインデックスは必要ありません。

def format(keyword, entries):
    return [(keyword, x) for x in entries]

format(e[0], e[1])
[('spam', 'aa'), ('spam', 'bb'), ('spam', 'cc'), ('spam', 'dd')]

これは、私が読まなかったコメントですでにmartineauによって回答されていたので、クレジットが必要な場合はクレジットします。ごめん。

于 2013-01-05T01:16:44.613 に答える
1

コメントからさまざまな解決策をまとめます(Satoru.Logicとmgilsonは、おそらくここで私よりも称賛に値します):

def format(entries): # no need to split it in the caller
    # consider yield from instead of return in 3.3+
    return itertools.izip_longest([], entries[1][1][0], fill=entries[0])

foo = format(entries)

ただし、元のコードが実際に正しいかどうかはわかりません。

を呼び出すとformat(entries[0], entries[1])、それはになりますformat(keyword, [obj1, obj2, obj3, ...])。次に、内部formatで、を繰り返し処理します。entries[1][0]つまりobj2[0]、他のすべてのエントリを無視します。それは正しくないようです。obj2が実際に文字列である場合'obj2'、たとえば、それは文字'o'です。だから、[(keyword, x) for x in entries[1][0]]ただになります[('keyword', 'o')]

于 2013-01-05T01:17:40.357 に答える