我正在寻找一种内存有效的方法来从列表中获取唯一数字,并遇到以下表达式
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
答案 0 :(得分:1)
在(used.add(x) or True)
中,used.add(x)
执行并返回None
,然后None
或True
将返回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
就可以做到。应该避免在理解中调用没有返回值的函数。
答案 5 :(得分:-1)
这种理解是一种非常愚蠢且耗时的写作方式:
(0.0,0.0)
这将给您完全相同的结果。