11

私はこのようなことをしたかったのですが、このコードはNoneのリストを返します(list.reverse()がリストを元に戻しているためだと思います):

map(lambda row: row.reverse(), figure)

私はこれを試しましたが、逆はイテレータを返します:

map(reversed, figure)

最後に、私はこのようなことをしましたが、それが正しい解決策であるかどうかはわかりません:

def reverse(row):
    """func that reverse a list not in place"""
    row.reverse()
    return row

map(reverse, figure)

誰かが私が知らないより良い解決策を持っている場合は、私に知らせてください

敬具、

4

5 に答える 5

27

Pythonのミューテイタブルコンテナのミューテイタメソッド(リストのメソッドなど).reverse、ほとんどの場合None、1つの有用な値を.pop返します。たとえば、メソッドはポップされた要素を返しますが、保持する重要な概念は、これらのミューテイタのいずれもミューテイタを返さないことです。コンテナ:むしろ、コンテナはインプレースで変異し、ミューテイタメソッドの戻り値はそのコンテナではありません。(これは、CQSの設計原理の適用です。たとえば、CQSを発明したBertrand Meyerによって考案された言語であるEiffelほど熱狂的ではありませんが、Pythonでは「実用性が純粋さを上回るためです。cfr import this;- )。

リストの作成は、イテレータの作成よりもコストがかかることがよくあります。これは、結果をループするだけの非常に一般的なケースです。reversedしたがって、 (およびモジュール内のすべてのすばらしいビルディングブロック)などの組み込みは、リストではなくitertoolsイテレータを返します。

しかし、したがって、イテレータxがあり、本当に同等のリスト yが必要な場合はどうでしょうか。ケーキ-ただやってくださいy = list(x)。タイプの新しいインスタンスを作成するには、タイプをlist呼び出します。これlistは非常に一般的なPythonのアイデアであるため、最初の2つの段落で指摘した非常に重要なものよりも保持することがさらに重要です!-)

したがって、特定の問題のコードは、前の段落の重要な概念に基づいて非常に簡単にまとめることができます。

[list(reversed(row)) for row in figure]

私はリスト内包表記を使用していることに注意してください map経験則として、それを構築する必要がないmap場合にのみ、最後の最適化として使用する必要があります(aが含まれている場合は、listcomp、およびいつものようにはっきりしているので、とにかく速くなる傾向があります!-)。lambdalambda

「Pythonの過去のマスター」になったら、プロファイリングでこのコードがボトルネックであることがわかった場合は、次のような代替手段を試すことができます。

[row[::-1] for row in figure]

ネガティブステップスライス(別名「火星のスマイリー」)を適用して、行の逆コピーを作成します。通常、list(reversed(row))アプローチよりも高速であることがわかっています。ただし、コードを自分自身または少なくともPythonに精通した人だけが保守することを意図している場合を除き、プロファイリングでペダルを踏むように指示されている場合を除いて、最も単純な「第一原理からのコード」アプローチを使用するのは防御可能な立場です。 。(個人的には、「火星のスマイリー」は、この優れた一般的な哲学をこの特定のユースケースに適用することを避けるのに十分重要だと思いますが、この非常に特定の点で合理的な人々が異なる可能性があります!-)。

于 2010-09-25T16:54:56.387 に答える
8

スライスを使用して、単一のリストの反転を取得することもできます (配置されていません)。

>>> a = [1,2,3,4]
>>> a[::-1]
[4, 3, 2, 1]

次のようなものです:

all_reversed = [lst[::-1] for lst in figure]

...また...

all_reversed = map(lambda x: x[::-1], figure)

...あなたがしたいことをします。

于 2010-09-25T16:29:15.400 に答える
3
reversed_lists = [list(reversed(x)) for x in figure]
于 2010-09-25T16:09:15.947 に答える
1
map(lambda row: list(reversed(row)), figure)
于 2010-09-25T16:07:34.970 に答える
0

単純に行うこともできます

for row in figure:
    row.reverse()

各行を所定の位置に変更します。

于 2010-09-25T18:04:40.820 に答える