最近搞了个小项目,想要寻找相同的信号通路,我有几个信号通路的列表,想要求它们的交集,然后,去网上寻找求多个数组交集的办法,结果却都是这样的:

a = 【1,2,3】

b = 【2,3,4】

c = 【3,4,5】

r = list(set(a).intersection(b,c))

print(r)

就需要在intersection函数后面输入所有的数组名称,这也太僵硬了,我有50个数组的话岂不是要输到天荒地老?

下面进入正文,通过csv文件读取,整合到嵌套列表中,统计了很多信号通路,读取方法如下:

【Python】批量读取csv文件的第一列,并整合到嵌套列表中_咋回事儿啊?的博客-CSDN博客

笔者的数据结构如下(当然不止四个,只是举例):

[[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]

目标:['4','5']

代码思路如下:

首先,我们要把列表进行合并,使用的是extend函数,把数据结构变成下面这样:

[1,2,3,4,5,2,3,4,5,6,3,4,5,6,7,4,5,6,7,8]

import numpy as np
import pandas as pd
#将嵌套列表转换为普通列表,将多个列表中的数据整合到一个列表a中
for k in range(1,len(totallist)):
    a = totallist[0]
    a.extend(totallist[k])

然后通过字典统计重复元素数量,并通过字典输出

dict1 = {}
for ele in a:
    if ele not in dict1.keys():#如果列表里面的元素不在字典key值中,那么创建一个新的key并统计元素出现的次数
        dict1[ele] = a.count(ele)

dict1 差不多长这样

{'1':1, '2':2, '3':3, '4':4, '5':4, '6':3, '7':2, '8':1}

然后就可以通过元素数量寻找交集,并集,差集,下面是寻找交集的方法。

#如果元素出现的次数等于数组的数量,那么这个元素就是多个数组的交集元素
max_key = [] #将结果储存在列表中
for e,f in dict1.items():
    if f == len(totallist):
        max_key.append(e)
print(max_key)
#寻找差集
#如果元素出现的次数等于1,那么这个元素就是多个数组的差集元素
max_key = [] #将结果储存在列表中
for e,f in dict1.items():
    if f == 1:
        max_key.append(e)
print(max_key)


#寻找并集直接打印key值即可
max_key = [] #将结果储存在列表中
for e,f in dict1.items():
        max_key.append(e)
print(max_key)

结果截图:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐