首页 > 解决方案 > 如何将重复的二维数组减少为一个

问题描述

我有以下二维数组,我希望根据数组的第一个值将重复减少为一个。

['AA' 'Put' 1]
['AAL' 'Call' 20]
['AAL' 'Put' 8]
['AAP' 'Call' 1]
['AAPL' 'Call' 1]
['AAPL' 'Put' 2]
['ABBV' 'Call' 1]
['ABBV' 'Put' 1]
['ABNB' 'Call' 6]
['ABNB' 'Put' 2]
['ABT' 'Call' 1]
['ACB' 'Call' 8]
['ADBE' 'Call' 1]
['ADP' 'Call' 1]
['AEO' 'Put' 1]
['AEZS' 'Call' 1]
['AG' 'Call' 1]
['AGNC' 'Put' 1]
['AHT' 'Call' 1]
The output I am looking is like this:
      call put
['AA' '0' '1']
['AAL' '20' 8]
['AAP' '1' 0]
['AAPL' '1' 2]
['ABBV' '1' 1]
['ABNB' '6' 2]
['ABT' '1' '0']
['ACB' '8' '0']
['ADBE' '1' '0']
['ADP' '1''0' ]
['AEO' '0' '1']
['AEZS' '1' '0']
['AG' '1' '0']
['AGNC' '0' 1]
['AHT' '1' '0']

here is my attempt
    arr2 = [[],[]] #the data
    twoDarry = []

    for items in range(len(arr2)):
        print(arr2[items])
        if(items+1<len(arr2)):
            if(arr2[items][0]==arr2[items+1][0]): #check if duplicate
                tmparr = []
                tmparr = arr2[items]
                tmparr.extend(arr2[items+1])
                twoDarry.append(tmparr)
            else:  # not duplicate
                twoDarry.append(arr2[items])
        

如果看涨或看跌是任务(意味着没有重复),则将零作为值。将其转换为 panada 不是一种选择,因为在某些时候我必须处理一些兼容性问题。我错过了什么?

标签: arrayspython-3.x

解决方案


首先,我将假设您的数据数组已正确格式化为列表列表,如下所示:

indat = [['AA', 'Put', 1], ['AAL', 'Call', 20], ['AAL', 'Put', 8], ['AAP', 'Call', 1], ['AAPL', 'Call', 1],
        ['AAPL,', 'Put', 2], ['ABBV', 'Call', 1], ['ABBV', 'Put', 1], ['ABNB', 'Call', 6],
        ['ABNB', 'Put', 2], ['ABT', 'Call', 1], ['ACB', 'Call', 8], ['ADBE', 'Call', 1],
        ['ADP', 'Call', 1], ['AEO', 'Put', 1], ['AEZS', 'Call', 1], ['AG', 'Call', 1], 
        ['AGNC', 'Put', 1], ['AHT' ,'Call', 1]]

鉴于您在问题中所描述的内容,我进一步假设您想要一个将数组作为变量并产生所需输出作为列表列表的函数。假设这些假设是正确的,以下函数将起作用。

def reduceArray(arr: list) -> list:
    indict= dict()
    for itm in arr:
        cv = indict.pop(itm[0], [0, 0])
        if itm[1] == 'Put':
            if cv[1] == 0:
                cv[1] = itm[2]
        else:
            if cv[0] == 0:
                cv[0] = itm[2]
        indict[itm[0]] = cv
    rslt = []
    for ky, val in indict.items():
        rslt.append([ky, val[0], val[1]])
    return rslt  

执行:

reduceArray(indat)  

产生:

[['AA', 0, 1],
 ['AAL', 20, 8],
 ['AAP', 1, 0],
 ['AAPL', 1, 0],
 ['AAPL,', 0, 2],
 ['ABBV', 1, 1],
 ['ABNB', 6, 2],
 ['ABT', 1, 0],
 ['ACB', 8, 0],
 ['ADBE', 1, 0],
 ['ADP', 1, 0],
 ['AEO', 0, 1],
 ['AEZS', 1, 0],
 ['AG', 1, 0],
 ['AGNC', 0, 1],
 ['AHT', 1, 0]]

推荐阅读