Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Set Difference - Fatal编程技术网

Python 在计算互补列表时如何正确处理重复项?

Python 在计算互补列表时如何正确处理重复项?,python,list,set-difference,Python,List,Set Difference,虽然这个问题似乎与之前的问题(比如这个:)有关,但它并不完全相同,即使是包含两条建议的最佳答案也不会完全回答下面的一条 我有一个主(无序)列表L包含重复的值;以整数列表为例: L = [3, 1, 4, 1, 5, 9, 2, 6, 5] 我有一个较小的列表,包含从L中选择的值,例如: x = [4, 1, 3] x中元素的顺序与L中元素的顺序没有任何关系 现在,我想计算差异L-x,以这样一种方式连接x,这个差异将给出与L相同的列表(顺序除外);更准确地说: list(sorted(x +

虽然这个问题似乎与之前的问题(比如这个:)有关,但它并不完全相同,即使是包含两条建议的最佳答案也不会完全回答下面的一条

我有一个主(无序)列表
L
包含重复的值;以整数列表为例:

L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
我有一个较小的列表,包含从L中选择的值,例如:

x = [4, 1, 3]
x
中元素的顺序与
L
中元素的顺序没有任何关系

现在,我想计算差异
L-x
,以这样一种方式连接
x
,这个差异将给出与
L
相同的列表(顺序除外);更准确地说:

list(sorted(x + D(L,x))) == list(sorted(L))
第一个坏主意显然是使用集合,因为重复的将无法正确处理

第二个坏主意是使用一些列表理解和过滤器,如:

[ e for e in L if e not in x ]
因为我的示例中的值
1
将被丢弃,尽管该值的一个实例应出现在预期的差异中

就我所见,最有效的方法是对两个列表进行排序,然后在两个列表上进行迭代(迭代器可能会有所帮助),并仔细考虑重复项;这将是一个O(n logn)解决方案


我不是在追求速度;我很想知道一些简洁的python语法是否可以做到这一点;如果能够在一行或两行中完成预期任务,则即使是O(n²)或更差也可以接受。

您想要集合提供的多集操作。计数器:

>>> L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
>>> x = [4, 1, 3]
>>> list((Counter(L) - Counter(x)).elements())
[1, 5, 5, 9, 2, 6]
>>> from collections import Counter
>>> 
>>> d = Counter(L) - Counter(x)
>>> list(d.elements())
[1, 5, 5, 9, 2, 6]
这是O(n)。如有必要,您还可以使用
OrderedCounter
来保留订单并维护O(n)

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict): 
    pass

您可能会争辩说,这对于这个任务来说太多了,但它保留了原始列表的顺序

    L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
    x = [4, 1, 3]

    temp = x[:]
    diff = []
    for i in L:
        if i in temp:
            temp.pop(temp.index(i))
            continue
        diff.append(i)
    print(diff)  # -> [1, 5, 9, 2, 6, 5]

似乎是
集合的一个很好的用法。计数器

>>> L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
>>> x = [4, 1, 3]
>>> list((Counter(L) - Counter(x)).elements())
[1, 5, 5, 9, 2, 6]
>>> from collections import Counter
>>> 
>>> d = Counter(L) - Counter(x)
>>> list(d.elements())
[1, 5, 5, 9, 2, 6]

线性时间的说法是可疑的。@wim怎么会这样?由于
temp.pop(temp.index(i))
?是的,如果我在temp
中,请显示您的示例的预期输出。那么您是在寻找两个列表的“差异”吗?可能重复:忘记了
计数器元素,谢谢提醒+1.