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

查找公共数据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)