为什么不给我空套?

时间:2018-09-21 23:39:17

标签: python-3.x list loops for-loop reverse

我有以下代码:

a=[[2,3],[3,2]]
new=[i for i in a if i.reverse not in a]
print(new)

这给了我

[[2,3],[3,2]]

但是它应该给我空集,因为[2,3]的倒数是[3,2],这是集合a的元素。

我该怎么解决?

2 个答案:

答案 0 :(得分:1)

您应该注意内置的reverse()属性,因为它会原地反转。根据您的用例,最好使用内置运算符reversed()

>> a = [[2, 3], [3, 2]]
>> new = [i for i in a if reversed(i) not in a]
>> print(new)
[[2, 3], [3, 2]]

那行不通!这是由于reversed()将返回一个迭代器对象,并且如果根据False进行检查,其结果将为a

>> reversed([2, 3])
<list_reverseiterator at 0x1c1d9cd550>

>> reversed([2, 3]) in a
False

因此,您需要使用list()来评估迭代器:

>> a = [[2, 3], [3, 2]]
>> new = [i for i in a if list(reversed(i)) not in a]
>> print(new)
[]

答案 1 :(得分:0)

您的代码中有两个错误。

首先,您不调用方法list.reverse,而只是检查它是否在list中。

if i.reverse not in a

第二,list.reverse颠倒了list,它没有返回新的。

>>> l = [1, 2, 3]
>>> output = l.reverse()
>>> print(output)
None
>>> l
[3, 2, 1]

这意味着即使调用该方法也是不正确的,因为它会返回错误的结果 并使您的列表a发生变异。

解决方案

请注意,对in使用list需要遍历整个列表。因此,对于大数据集,最好使用set进行恒定时间查找。

a = [[2, 3], [3, 2]]
set_for_lookup = set(map(tuple, a))

new = [i for i in a if tuple(i) not in set_for_lookup]

print(new) # []

构建set的开销会使小列表的运行速度稍慢一些,但是会大大改善大数据的算法,从 O(n 2 )< / em>转换为 O(n)