网络知识 娱乐 python技巧 - 查找两个列表的共有元素的 6 种方法

python技巧 - 查找两个列表的共有元素的 6 种方法

python编程中,经常会遇到两个或多个列表比较,或查找共有元素的问题,需要把两个或多个长度相等或长度不等的列表中的共有元素找出来,并保存到一个新的列表。解决这一问题,常见的方法有以下 6 种方法。

方法 1, 最简单也最常用的方法

def intersection(lst1, lst2):n lst3 = [value for value in lst1 if value in lst2]n return lst3n n# Driver Codenlst1 = [4, 9, 1, 17, 11, 26, 28, 54, 69]nlst2 = [9, 9, 74, 21, 45, 11, 63, 28, 26]nprint(intersection(lst1, lst2))

结果如下:

[9, 11, 26, 28]

方法2,使用 set() 函数

def intersection(lst1, lst2):n return list(set(lst1) & set(lst2))n n# Driver Codenlst1 = [15, 9, 10, 56, 23, 78, 5, 4, 9]nlst2 = [9, 4, 5, 36, 47, 26, 10, 45, 87]nprint(intersection(lst1, lst2))

结果如下:

[9, 10, 4, 5]

方法3:使用set()函数处理较长的列表,然后使用内置函数intersection() 计算出交集列表,其中 intersection() 是set的一级类方法。

def Intersection(lst1, lst2):n return set(lst1).intersection(lst2)n n# Driver Codenlst1 = [ 4, 9, 1, 17, 11, 26, 28, 28, 26, 66, 91]nlst2 = [9, 9, 74, 21, 45, 11, 63]nprint(Intersection(lst1, lst2))n

结果如下:

{9, 11}

方法4 :这是一种混合方法,运行效率比较高。

def intersection(lst1, lst2):n n # Use of hybrid methodn temp = set(lst2)n lst3 = [value for value in lst1 if value in temp]n return lst3n n# Driver Codenlst1 = [9, 9, 74, 21, 45, 11, 63]nlst2 = [4, 9, 1, 17, 11, 26, 28, 28, 26, 66, 91]nprint(intersection(lst1, lst2))

结果如下:

[9, 9, 11]

方法 5 : 这种方法可以处理二维列表,查找其中一个一维列表与二维列表中的子列表的交集,使用filter() 函数

def intersection(lst1, lst2):n lst3 = [list(filter(lambda x: x in lst1, sublist)) for sublist in lst2]n return lst3n n# Driver Codenlst1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]nlst2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]nprint(intersection(lst1, lst2))

结果如下:

[[13, 32], [7, 13, 28], [1, 6]]

方法6:使用 pandas 中的 merge() 函数。这是一个较复杂的实例,从项目中提取。

问题: 从allstocks.csv、symbol_findata.csv 和 shenwan2_category_stocks.csv 文件中,找出申万二级分类所包含的股票。

文件 allstocks.csv 包括4292个股票代码,格式如下

python技巧 - 查找两个列表的共有元素的 6 种方法

编码 1600000 的含义: 1 - 市场代码,1 表示沪市,600000 - 股票代码

文件 symbol_findata.csv 包括 4950 只股票及其总股本、流通股本和市净率,格式如下:

python技巧 - 查找两个列表的共有元素的 6 种方法

文件 shenwan2_category_stocks.csv, 包括4416只股票的申万二级分类名称和编码、交易市场及股票代码、股票名称、总市值和流通市值,格式如下:

python技巧 - 查找两个列表的共有元素的 6 种方法


import pandas as pdnimport csvnimport functools as ftnnwith open('.work_dataallstocks.csv','r',encoding='utf-8') as f:n reader = csv.reader(f)n allstocks_lst = []n for line in reader: #遍历n #print(line[0])n allstocks_lst.append(line[0][1:]) nprint(allstocks_lst[0:10])nprint('allstocks_lst len:',len(allstocks_lst))nallstocks_df = pd.DataFrame(allstocks_lst, columns =['symbol']) nprint(allstocks_df[0:4])nnn##2. symbol_findata.csv中的列: 'stock_code','total_shares','current_flowshares','netearningrate'nsymbol_financialdata = pd.read_csv('.work_datasymbol_findata.csv',header = 0, n dtype = {'stock_code':str,'total_shares':float,'current_flowshares':float,'netearningrate':float})nprint(symbol_financialdata[0:3])n# 基于现有的列创建一个新列, df['Discounted_Price'] = df['Cost'] - (0.1 * df['Cost'])n# df[['First','Last']] = df.Name.str.split("_",expand=True)nnstockcode_lst1 = [x[3:] for x in symbol_financialdata.stock_code.iloc[:].values.tolist() if x[3:5] !='68']nprint('symbol_financialdata len:',len(stockcode_lst1))nsymbol_financialdata[['marketID','symbol']] = symbol_financialdata.stock_code.str.split("#",expand=True)nprint(symbol_financialdata[0:3])nnn##3. shenwan2_category_stocks.csv中的列:shw2_code,category_name,category_mktcode,stock_code,stock_name,stock_mktcap,stock_nmcnshw2_category_stocks = pd.read_csv('.work_datashenwan2_category_stocks.csv',header = 0, n dtype = {'stock_code':str,'category_name':str,'category_mktcode':str,'stock_code':str,n 'stock_mktcap':float,'stock_nmc':float})nprint(shw2_category_stocks[0:3])nstockcode_lst2 = shw2_category_stocks.stock_code.iloc[:].values.tolist()nprint('shw2_category_stocks len:',len(stockcode_lst2))nshw2_category_stocks['symbol'] = shw2_category_stocks['stock_code']nprint(shw2_category_stocks[0:3])n# filtered1_stockcode = [x for x in stockcode_lst2 if any(y in x for y in stockcode_lst1)]n# print('filtered1_stockcode len:',len(filtered1_stockcode))nnnndf_merged = ft.reduce(lambda left, right: pd.merge(left, right, on='symbol'), [allstocks_df,symbol_financialdata,shw2_category_stocks])nfor i in range(0,5): # len(df_merged)n print(df_merged.symbol.iloc[i],df_merged.stock_code_x.iloc[i],n df_merged.total_shares.iloc[i],df_merged.current_flowshares.iloc[i],n df_merged.netearningrate.iloc[i],df_merged.marketID.iloc[i],n df_merged.shw2_code.iloc[i],df_merged.category_name.iloc[i],n df_merged.category_mktcode.iloc[i],df_merged.stock_code_y.iloc[i],n df_merged.stock_name.iloc[i],df_merged.stock_mktcap.iloc[i],n df_merged.stock_nmc.iloc[i])nnprint(len(df_merged)) nngroups = df_merged.groupby(['category_name']) npositions_list = []neverygroup_len = []nfor group_key, group_value in groups:n group = groups.get_group(group_key)n #quantity_tmp = sum(group['quantity']*group['buy_sell'])n print('------------------------------')n print(group)n everygroup_len.append([group_key,len(group)])nnprint('groups len:',len(groups))nnfor itm in everygroup_len:n print(itm)

运行结果如下,截图1:

python技巧 - 查找两个列表的共有元素的 6 种方法

运行结果如下,截图2:

python技巧 - 查找两个列表的共有元素的 6 种方法

(截图2 显示 申万二级分类的名称及其所属的股票个数)