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