これまでのところ存在しないため、実際に内包表記を使用して構築されているリストにアクセスできるとは思えません。
とはいえ、これは機能的な方法で重複を削除するリストを作成できないという意味ではありません。(Python では TCO が許可されていないことに注意してください。)
セットや順序付きセットなどではなくリストを使用して、別のリストからリストを作成する場合、1 つの方法は次のようになります (中途半端な機能スタイル)。
def removeDuplicates (inList, acc):
if not inList: return acc
if inList [0] in acc: return removeDuplicates (inList [1:], acc)
return removeDuplicates (inList [1:], acc + [inList [0] ] )
#even tail-recursive, although this doesn't help in python
print (removeDuplicates ( [1,2,3,2,3,5,1], [] ) )
動作します。それでは、それからラムダ式を作成しましょう。
rd = lambda inList, acc: acc if not inList else rd (inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) )
print (rd ( [1,2,3,2,3,5,1], [] ) )
動作します。それでは、匿名性と再帰のためにこのラムダを準備しましょう。
rd2 = lambda f, inList, acc: acc if not inList else f (f, inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) )
rec = lambda f, *a: f (f, *a)
print (rec (rd2, [1,2,3,2,3,5,1], [] ) )
まだ動作します。次に、ラムダの名前を削除して、重複を削除しながら別のリストからリストを作成する再帰的なラムダを取得します (for
または他の命令型ループなしで)。
print ( (lambda f, *a: f (f, *a) ) (lambda f, inList, acc: acc if not inList else f (f, inList [1:], acc + ( [] if inList [0] in acc else [inList [0] ] ) ), [1,2,3,2,3,5,1], [] ) )
正確には読めませんが、機能的で再帰的です。
あなたが関数型プログラミングに興味があるなら、lambda f, *a: f (f, *a)
きっとあなたの親友になるでしょう。
inb4import this
と PEP8。