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。)

如果我们想从另一个列表构建一个列表,只使用列表而不是集合、有序集合等,一种方法可能是(中途函数式):

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], [] ) )

作品。所以让我们用它构建一个 lambda 表达式:

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], [] ) )

也有效。现在让我们为匿名和递归准备这个 lambda:

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], [] ) )

仍然有效。现在让我们删除 lambda 的名称,我们得到一个递归 lambda,它从另一个构建列表,同时删除重复项(没有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 回答