2

型にはまらないコードを使用して複雑な辞書を構築しています。重複/不要な値を回避するために、現在の辞書の値または現在のリストの値を構築中にチェックする方法があるかどうか、私はただ興味があります。ここに私が持っているコードがあります:

locations = {words[i]: map(lambda x: words[x::].index(words[i]) if words[i] in words[x::] and words[x::].index(words[i]) not in self[words[i]] else None, range(len(words))) for i in range(len(words))}

# the important part here is 

and words[x::].index(words[i]) not in self[words[i]]

for/while反復なしで上記のようなことは可能ですか?

4

1 に答える 1

4

これまでのところ存在しないため、実際に内包表記を使用して構築されているリストにアクセスできるとは思えません。

とはいえ、これは機能的な方法で重複を削除するリストを作成できないという意味ではありません。(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。

于 2013-08-08T00:36:37.857 に答える