查找公共数据python
使用 运行查找公共数据python,python,python-3.x,Python,Python 3.x,使用 运行compare_lsts([1,2,3,4,5],[3,8,9,1,7])给出两个集合中包含的数字,即[1,3] 但是,制作列表1包含不止一个列表,例如,比较列表([1,2,3,4,5],[5,8,2,9,12],[3,7,19,4,16],[3,7,2,16,19])给出了[],[],[],[/code> 我在列表1中使用了for list,后面是循环的结果。我显然不知道我在做什么 基本上,问题是:如何将一个静态列表中的项目与尽可能多的列表进行比较?不确定这是否是最好的方法,但是:
compare_lsts([1,2,3,4,5],[3,8,9,1,7])
给出两个集合中包含的数字,即[1,3]
但是,制作列表1包含不止一个列表,例如,比较列表([1,2,3,4,5],[5,8,2,9,12],[3,7,19,4,16],[3,7,2,16,19])
给出了[],[],[],[/code>
我在列表1中使用了for list,后面是循环的结果。我显然不知道我在做什么
基本上,问题是:如何将一个静态列表中的项目与尽可能多的列表进行比较?不确定这是否是最好的方法,但是:
def compare_lsts(list1,list2):
first_set = set(list1)
second_set=set(list2)
results =[x for x in list1 if x in list2]
print(results)
首先,您已经开始使用集合,所以您肯定应该使用它们,因为它们在检查包容时更快。此外,集合已经有一些有用的内置功能,因此要比较两个列表,您可以将集合相交,以获取两个列表中的项目:
>set1=set([1,2,3,4,5])
>>>set2=set([3,8,9,1,7])
>>>set1和set2
{1, 3}
>>>list(set1和set2)#如果您需要一个列表作为输出
[1, 3]
类似地,您还可以找到两个集合的并集,以获取任何集合中的项目:
>>set1 | set2
{1, 2, 3, 4, 5, 7, 8, 9}
因此,如果您想从列表2中查找列表1的任何子列表中的所有项目,则可以将所有子列表与列表2相交,然后合并所有这些结果:
>>子列表=[set([1,2,3,4,5])、set([5,8,2,9,12])、set([3,7,19,4,16])]
>>>otherset=set([3,7,2,16,19])
>>>交叉点=[子列表中的子列表的子列表和其他集合]
>>>交叉点
[{2, 3}, {2}, {16, 3, 19, 7}]
>>>union=set()
>>>对于交叉口中的交叉口:
并集=并集|交点
>>>联合
{16, 19, 2, 3, 7}
您还可以使用functools更好地执行此操作。reduce
:
导入工具
>>>functools.reduce(set.union,交点)
{16, 19, 2, 3, 7}
类似地,如果您希望实际相交于这些结果,您也可以这样做:
>functools.reduce(set.intersection,crossions)
集合()
最后,您可以将所有这些都打包到一个漂亮的函数中:
def比较列表(主列表,*其他列表):
mainSet=set(mainList)
otherSets=[为otherList中的otherList设置(otherList)]
交叉口=[其他集合中其他集合的mainSet和其他集合]
返回functools.reduce(set.union,crossions)#或替换为set.crossion
然后像这样使用它:
比较列表([1,2,3,4,5],[3,8,9,1,7])
{1, 3}
>>>比较列表([3,7,2,16,19],[1,2,3,4,5],[5,8,2,9,12],[3,7,19,4,16])
{16, 19, 2, 3, 7}
请注意,我替换了函数中参数的顺序,因此首先提到了主列表(在您的示例中为list2),因为它是其他列表的比较对象。如果您要查找列表中第一个元素中的所有元素:
def flat(l):
c_l = []
for i in l:
if isinstance(i,list):
map(c_l.append,i)
else:
c_l.append(i)
return c_l
def compare_lsts(a,b):
if all([True if isinstance(x,list) else False for x in a]): #if there is sublists in a
a = flat(a) #flats a
if all([True if isinstance(x,list) else False for x in b]): #if there is sublists in b
b = flat(b) #flats b
return list(set(a) & set(b)) #intersection between a and b
print (compare_lsts([[1,2,3,4,5],[5,8,2,9,12],[3,7,19,4,16]],[3,7,2,16,19]) #[16, 3, 2, 19, 7])
如果您要查找其他列表中任何中第一个列表中的元素:
set(first).intersection(second, third) # fourth, fifth, etc...
>>> set([1, 2, 3]).intersection([2, 3, 4], [3, 4, 5])
set([3])
那么,一个简单的函数:
>>> set([1, 2, 3]) & set([4]).union([5])
set([2])
对于后一种情况,您的预期输出是什么?您只是想查找所有列表中的所有数字,还是想查找
list2
中任何list1
子列表中的数字?OP的列表[5,8,2,9,12]
不能使用字符串序列显示。更不用说,您会丢失实际的数据类型信息…@poke字符串与此有什么关系?输入set('123')比设置它([1,2,3])更容易-出于演示目的,它仍然是3个唯一的对象(不确定您所说的数据类型信息是什么意思).set(['2'])
与set([2])
不同,因为'2'
与2
不同。虽然它可能更容易键入,但它更容易混淆,因为初学者总是将字符串理解为单个对象,而不是字符序列,因此您正在混淆相关信息。@poke ok-非故意混淆removedwow!非常感谢你。当我使用上面所写的多个集合的比较时,我得到了“TypeError:unsupported operand type for&:“list”和“set”我又做了什么蠢事了吗?然后你没有先做一个集合;需要设置和的两个操作数。你可以通过执行set(lst)
来转换你的列表。我真是个傻孩子!在子列表的定义中省略了一个方括号。如果我没有…从这个[]、[]、[]返回,它现在将一如既往地工作。显然,我没有正确地执行某些操作,尽管我相信我已经完全按照上面的方式重新键入了它,并使用了Python Visualisor
def in_all(fst, *rst):
return set(fst).intersection(*rst)
def in_any(fst, *rst):
it = iter(rst)
return set(fst) & set(next(it, [])).union(*it)