2

次の Common Lisp コードの python での同等のリスト内包表記は何ですか:

(loop for x = input then (if (evenp x)
                             (/ x 2)
                             (+1 (* 3 x)))
      collect x
      until (= x 1))
4

6 に答える 6

4

ローレンスが言及したハッカリー:

あなたは1つのリスト内包でそれを行うことができます、それはただひどいpythonであることになります。読めないPython。ひどいPython。私は、実際の答えとしてではなく、好奇心として以下を提示するだけです。Pythonの内部動作を試してみたい場合にのみ、実際に使用したいコードでこれを行わないでください。

したがって、3つのアプローチ:


ヘルプリスト1

1:ヘルプリストを使用すると、回答はヘルプリストに表示されます。これにより、停止する値に到達するまで繰り返されるリストに値が追加されます。

A = [10]
print [None if A[-1] == 1
    else A.append(A[-1]/2) if (A[-1]%2==0) 
    else A.append(3*A[-1]+1) 
        for i in A]
print A

結果:

[None, None, None, None, None, None, None]
[10, 5, 16, 8, 4, 2, 1]

ヘルプリスト2

2:ヘルプリストを使用しますが、結果はリスト内包の出力になります。これは主に、算術の目的でlist.append(...)返されNonenot None評価されTrueTrue考慮されることに依存しています。1はぁ。

A=[10]
print [A[0]*(not A.append(A[0])) if len(A) == 1 
    else 1 if A[-1] == 2 else (A[-1]/2)*(not A.append(A[-1]/2)) if (A[-1]%2==0) 
    else (3*A[-1]+1)*(not A.append(3*A[-1]+1)) 
        for i in A]

結果:

[10, 5, 16, 8, 4, 2, 1]

内部からリスト内包表記を参照する

3:ヘルプリストを使用しませんが、作成中のリスト内包表記を参照します。これは少し壊れやすく、おそらくすべての環境で機能するわけではありません。それが機能しない場合は、コードを単独で実行してみてください。

from itertools import chain, takewhile
initialValue = 10
print [i if len(locals()['_[1]']) == 0
    else (locals()['_[1]'][-1]/2) if (locals()['_[1]'][-1]%2==0)
    else (3*locals()['_[1]'][-1]+1) 
        for i in takewhile(lambda x:x>1, chain([initialValue],locals()['_[1]']))]

結果:

[10, 5, 16, 8, 4, 2, 1]

だから、今あなたがこれを読んだことを忘れてください。これは暗くて暗くて薄汚いPythonです。邪悪なパイソン。そして、Pythonが悪ではないことは誰もが知っています。Pythonは素敵でいいです。ですから、こういうものは存在し得ないので、これを読むことはできません。いいね。

于 2009-07-14T15:55:53.677 に答える