0

私はあなたの助けが必要です、私はこのような構造を持っています:

myList = [(1,2,3),(2,4,4),(1,5,6)]

タプルのリストです。ここで、リスト内の各タプルの最初の要素をすべて取得して、たとえばそれぞれ1を. に置き換える必要があり3ます。

出力は次のようになります。myList = [(3,2,3),(2,4,4),(3,5,6)]

私はそれを次のようにできることを知っています:

for item in myList:
   if item[0] == 1:
      item[0] = 3

しかし、これを行う他の方法はありますか?リスト全体を反復せずに?

何かのようなもの:myList.getFirstItemOfEachTuple.replace(1,3)

編集:必要myListに応じてに変更できます[[1,2,3,4,5,6]...]

4

5 に答える 5

5
>>> myList = [(1,2,3,4,5,6),(4,5,6,7,8)]
>>> dic = {1:3}
>>> [ (dic.get(x[0],x[0]),) + x[1:] for x in myList]
[(3, 2, 3, 4, 5, 6), (4, 5, 6, 7, 8)]

myListがリストのリストの場合:

>>> myList = [[1,2,3,4,5,6],[4,5,6,7,8]]
>>> [ [dic.get(x[0],x[0]) ] + x[1:] for x in myList]
[[3, 2, 3, 4, 5, 6], [4, 5, 6, 7, 8]]

元のリストを変更するには:

>>> myList[:] = [(dic.get(x[0],x[0]),) + x[1:] for x in myList]
>>> myList
[(3, 2, 3, 4, 5, 6), (4, 5, 6, 7, 8)]
于 2013-05-31T08:56:28.463 に答える
3

しかし、これを行う他の方法はありますか?リスト全体を反復せずに?

いいえ。リスト全体を反復処理する必要はありません。

各タプルを調べて、変更したい要素が特定の数であるかどうかを確認したいので、何らかの方法でリスト全体を反復処理する必要があります。したがって、残っている唯一の考慮事項は、それを行う方法です。

コードの書き方を決めるのに役立つ、実績のある業界標準の優れたガイドラインがあります。コードを書くときは、コードの読みやすさ優先にする必要があります。コードの効率性は、2 番目に大きく影響します。この規則には例外がありますが、ここでは関係ありません。

元のコードを見てください。であると想定しitemているlistので、私も次のようにします。

for item in myList:
    if item[0] == 1:
        item[0] = 3

ここで、Ashwini の提案と比較してください。

dic = {1: 3}
myList[:] = [[dic.get(x[0], x[0])] + x[1:] for x in myList]

自問してみてください:

  • 読みやすく、理解しやすいのはどれですか。答えは明白だと思います。
  • どちらがより効率的ですか?

効率を見てみましょう。

  • 元のコード:の各アイテムmyListに対して、単一のリスト ルックアップを実行し、場合によっては単一のリスト割り当てを実行します。どちらも非常に高速な操作です。

  • Ashwinis コード:全体の構造を再構築します。myListPythonの項目ごとに、3 つの新しいリストを作成する必要があります (最初ではない項目を変更する場合は5 つ)。Python は各リストに新しいメモリを割り当てる必要があり、多くの古いリストをガベージ コレクションする必要があり、どちらの操作もかなり遅くなります。すべてはワンライナーに詰め込むためです。

元のコードで行ってください理由は次のとおりです。

  • それはそれを行う明白な方法です。
  • それはそれを行うためのpythonicな方法です。
  • これが最も読みやすい方法です。
  • それを行うのが最も効率的な方法です。

つまり、それが正しい方法です。

ワンライナーが必要な場合は、関数にします。

def conditional_sublist_assign(myList, index, from, to):
    """
    For each `item` in `myList`, set `item[index] = to` if `item[index] == from`.
    """
    for item in myList:
        if item[index] == from:
            item[index] = to

# Here's your one-liner:
conditional_sublist_assign(myList, 0, 1, 3)

私の議論をさらに強調するために、 The Zen of Pythonから関連する行をいくつか示します。

  • 美しいことは醜いことよりも優れています。
  • シンプルは複雑よりも優れています。
  • 読みやすさが重要です。
  • それを行う明白な方法が 1 つ (できれば 1 つだけ) ある必要があります。
  • 実装を説明するのが難しい場合、それは悪い考えです。
于 2013-05-31T09:39:27.733 に答える