在理解列表理解表达方面需要帮助

时间:2019-11-14 08:08:51

标签: python

我正在寻找一种内存有效的方法来从列表中获取唯一数字,并遇到以下表达式

used = set()
mylist = [1,2,3,4,3,2,3,4,5,3,2,1]
[x for x in mylist if x not in used and (used.add(x) or True)]

这是在获取唯一编号,但是并不清楚它是如何工作的。以下是我的理解

x for x in mylist  # Iterating through a list
if x not in used  # If statement saying if X not in empty set as defined above
and (used.add(x) or True)  # No idea what it is saying

6 个答案:

答案 0 :(得分:1)

(used.add(x) or True)中,used.add(x)执行并返回None,然后NoneTrue将返回True。基本上,在第一次迭代set.add()中的项目时,可以通过列表理解来实现mylist

答案 1 :(得分:1)

这种理解等同于以下循环:

used = set()
mylist = [1,2,3,4,3,2,3,4,5,3,2,1]
result = []
for x in mylist:
    if x not in used:
        used.add(x)
        result.append(x)
理解中的

x not in used部分用于实际过滤,第二部分用于在理解过程中将x添加到used集({{1 }}是一种可防止其影响过滤条件的技巧。

答案 2 :(得分:1)

infos_container: {
   backgroundColor: 'orange',
   flexDirection: 'row',
   flexWrap: 'wrap',
   padding: 5,
},

如果这是您第一次看到此值,则该表达式返回x not in used 。这样就变成了:

True

由于True and (used.add(x) or True) 的左侧为and,因此它将继续评估右侧。这将执行True,将used.add(x)添加到x集。由于used不返回任何内容,因此.add确保此表达式产生 truthy 值。因此整个or True条件导致:

if

哪个是True and (None or True) ,所以它是True,所以这个if True被保留在列表推导中。

相反,如果您第一次看到该值时不是 ,则表达式会简化为:

x

因此,x not in used and (used.add(x) or True) → False and (used.add(x) or True) → False 不会被执行,并且整个表达式都将生成add,因此该False将从列表推导中排除。

TBH,这是一种相当晦涩的方法,这一问题的存在证明了这一点。

答案 3 :(得分:0)

如果需要的话,...部分就差不多了。

您有权使用的第一部分-如果(未使用x)。如果不使用x,则为True(因此将x添加到理解列表)。 在comp的开头,used为空,因此其中没有任何内容,因此任何x都将表示为true。

但是在那之后,您想将x添加到使用过的列表中-如您现在所看到的,并且不想再次使用(x未使用过)。

因此,第二部分-(used.add(x)或True)-将x添加到使用的列表中。如果add(x)为False,则它需要为“或True”,如果x已经在列表中,它将为true,然后尝试再次添加。

答案 4 :(得分:0)

想法只是used.add(x)需要“以某种方式”执行。它将当前数字附加到used并将始终返回None。因此,(used.add(x) or True)将始终为True,这不会影响列表理解。就是说,仅用list(OrderedSet(mylist))调用from orderedset import OrderedSet就可以做到。应该避免在理解中调用没有返回值的函数。

编辑:请参见https://pypi.org/project/orderedset/

答案 5 :(得分:-1)

这种理解是一种非常愚蠢且耗时的写作方式:

(0.0,0.0)

这将给您完全相同的结果。