我有以下代码:
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的元素。
我该怎么解决?
答案 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)。