Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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 - Fatal编程技术网

Python 替换集()以保留重复项

Python 替换集()以保留重复项,python,Python,我问如何创建一个列表,其中只包含比较此处两个文件的新条目: 问题是我想保留重复项,而使用set()(我的实际列表有35000个值)似乎不可能。 如何更改它以保留副本 #last file ccv_last = [] for item_last in last_data: results_last = item_last["results"] if results_last: for result_last in results_last:

我问如何创建一个列表,其中只包含比较此处两个文件的新条目:

问题是我想保留重复项,而使用
set()
(我的实际列表有35000个值)似乎不可能。 如何更改它以保留副本

    #last file
ccv_last = []
for item_last in last_data:
    results_last = item_last["results"]
    if results_last:
        for result_last in results_last:
            ccv_last.append(result_last["img_url"])
#second file
ccv_second = []
for item_second in second_data:
    results_second = item_second["results"]
    if results_second:
        for result_second in results_second:
            ccv_second.append(result_second["img_url"])

diff_list = list(set(ccv_last)-set(ccv_second)))
即使我有重复的结果:

['https://img.com/30.jpg', 'https://img.com/3.jpg']

正如注释中指出的,
set
旨在删除重复项。Python并不支持您想要的东西(至少不是以一种有效的方式),但是有一些简单的方法可以实现它们

这里我将演示两种不同的实现。我的假设是:

  • 您只对执行此“set difference”操作感兴趣,该操作定义为“为右集合中的每个元素从左集合中移除(单个副本)元素”
  • 差分操作在所有插入操作之后执行,并且仅执行一次

解决方案1:排序列表 可以使用列表简单地实现这一点:

定义差异列表(a、b): a=列表(a)#复制一份“a”` 对于b中的x:#迭代`b中的元素` 如果a中有x: a、 删除(x)#删除'a'中'x'的单个副本` 归还 然而,这是非常低效的。如果您熟悉复杂性理论,则上述算法的时间复杂性为
O(|a |*|b |)
,其中
|a
表示列表
a
的长度

一种更有效的方法是对两个列表进行排序,然后同时遍历两个数组:

def差异_排序(a、b):
a=已排序(a)#对两个列表进行排序
b=已排序(b)
结果=[]
pos=0#指向列表'b的指针`
对于a中的x:
当pos

解决方案2:计数器
collections
包包含一个计数每个添加元素出现次数的
计数器类型:

从集合导入计数器
c=计数器(['a','b','c','a','a','b'])
打印(c)#计数器({'a':3,'b':2,'c':1})
因此,您可以为每个“集合”维护一个计数器,并使用存储的计数有效地执行差分操作:

def差异_计数器(a、b):
a=计数器(a)#为两个列表构造计数器
b=计数器(b)#您还可以在迭代原始数据时直接维护计数器
#计数器本质上是一个字典,因此支持'dict'方法。
对于x,b.items()中的cnt:#迭代`b中的元素和计数`

如果a中的x和a[x]中有一个模块

>set1=Multiset('aab')
>>>set2=多集('abc')
>>>已排序(set1 | set2)
['a','a','b','c']

那你为什么要使用
集合
呢?根据定义,集合不能包含重复项。一个
集合
“修改为包含重复项”只是一个
列表
。因为我在使用它时不知道这一点,我在寻找问题的解决方案时发现了这一点
pip install multiset