Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Python的相似性_Python_List_Compare - Fatal编程技术网

删除Python的相似性

删除Python的相似性,python,list,compare,Python,List,Compare,该列表包含其他列表: L = [[3, 3], [4, 2], [3, 2]] 如果子列表的第一个元素等于其他子列表的第一个元素,则必须从整个列表中删除具有较高第二个元素的元素 因此,新的清单是: L = [[4,2], [3,2]] 如何尽可能高效地执行此操作?如果您不关心输出列表中元素的顺序,那么您可以创建一个字典,将第一个项目映射到第二个项目,然后从最小值构造结果 from collections import defaultdict L = [[3, 3], [4, 2], [3,

该列表包含其他列表:

L = [[3, 3], [4, 2], [3, 2]]
如果子列表的第一个元素等于其他子列表的第一个元素,则必须从整个列表中删除具有较高第二个元素的元素

因此,新的清单是:

L = [[4,2], [3,2]]

如何尽可能高效地执行此操作?

如果您不关心输出列表中元素的顺序,那么您可以创建一个字典,将第一个项目映射到第二个项目,然后从最小值构造结果

from collections import defaultdict
L = [[3, 3], [4, 2], [3, 2]]
d = defaultdict(list)
for k,v in L:
    d[k].append(v)
result = [[k, min(v)] for k,v in d.iteritems()]
print result
结果:

[[3, 2], [4, 2]]
这是相当有效的-在平均情况下,在*logn最坏的情况下

L.sort(key=lambda x: x[1], reverse=True)
L = OrderedDict(L).items()
为什么会这样

如果使用列表或元组执行dictL,这或多或少相当于:

{k: v for k, v in L}
如您所见,如果存在重复的关键点k,则后面的值将覆盖前面的值

如果我们能把L按正确的顺序排列,我们就可以利用它

在您的情况下,我们并不真正关心键的顺序,但我们希望较低的值,即子列表的第二个元素稍后出现。这样,任何较低的值都会用相同的键覆盖较高的值

按子列表的第二个元素按相反顺序排序就足够了。由于list.sort是稳定的,因此它也尽可能保留条目的原始顺序

L.sort(key=lambda x: x[1], reverse=True)
collections.OrderedDictL现在通过第一个元素使元素唯一,保持插入顺序

排序在ln上,dict创建在ln上添加另一个。可以不使用排序:

d = OrderedDict()    
for k, v in L:    
    ev = d.get(k, None)    
    # update value. Always if key is not present or conditionally
    # if existing value is larger than current value
    d[k] = v if ev is None or ev > v else ev    

L = d.items()
但在纯Python中,代码要多得多,而且可能根本不会或速度也不会快很多

编辑:1使用非整数键2按第二个元素排序就足够了,不需要完全排序。

您也可以使用它

x = [[3, 3], [4, 2], [3, 2]]
for i in x:
   if i[0]==i[1]:
       x.pop(x.index(i))

运行循环时,首先取第一个子列表与其他子列表进行比较,然后取第二个子列表从一开始进行比较,然后取第三个子列表从一开始再次进行比较,依此类推。在内存或时间方面效率很高?在这种情况下,时间对我来说更重要。是的,我不关心排序。第二个版本很整洁,“但是对于那些不太熟悉Python细节的人来说,一个解释是很好的。”Jornsharpe补充道,它也可以进行概括和简化。我也这么做了。我认为你还没有理解这个问题——虽然它可以处理特定的输入集,但它没有使用正确的算法,所以在一般情况下会失败。