0

下面的代码的目的是处理两个字典,如果值包含列表中的项目,则将symbol每个字典中的匹配值添加到pairs列表中,cur但如果值包含curpair列表中的任一项目,则不添加。

我的值匹配成功,cur但我不知道如何对curpair. 此外,次要问题是它似乎会创建重复项,这可能是因为forcurpair. 无论哪种方式,我都不确定是否有一种方法可以在线进行重复数据删除,或者这是否需要成为另一个例程。

我确信可能有一种方法可以做到所有这些,并同时通过列表理解简化代码,但也许不是。我试图理解列表理解只会让我放心,我的 Python 经验太短了,无法理解:)

感谢任何见解。

cur='EUR'
curpair=['BUSD', 'USDT']

def get_pairs(tickers):
    pairs = []
    for entry in tickers:
        if cur in entry['symbol']:
            for cp in curpair:
                if cp not in entry['symbol']:
                    pairs.append(entry['symbol'])
    return pairs

# d1 and d2 @ https://pastebin.com/NfNAeqD4
spot_pairs_list = get_pairs(d1)
margin_pairs_list = get_pairs(d2)
print(f"from d1: {spot_pairs_list}")
print(f"from d2: {margin_pairs_list}")

输出:

from d1: ['BTCEUR', 'BTCEUR', 'ETHEUR', 'ETHEUR', 'BNBEUR', 'BNBEUR', 'XRPEUR', 'XRPEUR', 'EURBUSD', 'EURUSDT', 'SXPEUR', 'SXPEUR', 'LINKEUR', 'LINKEUR', 'DOTEUR', 'DOTEUR', 'LTCEUR', 'LTCEUR', 'ADAEUR', 'ADAEUR', 'BCHEUR', 'BCHEUR', 'YFIEUR', 'YFIEUR', 'XLMEUR', 'XLMEUR', 'GRTEUR', 'GRTEUR', 'EOSEUR', 'EOSEUR', 'DOGEEUR', 'DOGEEUR', 'EGLDEUR', 'EGLDEUR', 'AVAXEUR', 'AVAXEUR', 'UNIEUR', 'UNIEUR', 'CHZEUR', 'CHZEUR', 'ENJEUR', 'ENJEUR', 'MATICEUR', 'MATICEUR', 'LUNAEUR', 'LUNAEUR', 'THETAEUR', 'THETAEUR', 'BTTEUR', 'BTTEUR', 'HOTEUR', 'HOTEUR', 'WINEUR', 'WINEUR', 'VETEUR', 'VETEUR', 'WRXEUR', 'WRXEUR', 'TRXEUR', 'TRXEUR', 'SHIBEUR', 'SHIBEUR', 'ETCEUR', 'ETCEUR', 'SOLEUR', 'SOLEUR', 'ICPEUR', 'ICPEUR']
from d2: ['ADAEUR', 'ADAEUR', 'BCHEUR', 'BCHEUR', 'BNBEUR', 'BNBEUR', 'BTCEUR', 'BTCEUR', 'DOTEUR', 'DOTEUR', 'ETHEUR', 'ETHEUR', 'EURBUSD', 'EURUSDT', 'LINKEUR', 'LINKEUR', 'LTCEUR', 'LTCEUR', 'SXPEUR', 'SXPEUR', 'XLMEUR', 'XLMEUR', 'XRPEUR', 'XRPEUR', 'YFIEUR', 'YFIEUR']
4

1 回答 1

2

double 值的问题可以很容易地通过使用set而不是来解决list

至于另一个问题,这个循环没有做正确的事情:

for cp in curpair:
    if cp not in entry['symbol']:
        pairs.append(entry['symbol'])

curpair如果缺少任何元素,这会将符号附加到列表中。例如,如果第一个元素cp不在 in 中symbol,即使第二个元素在 in 中,它也会接受symbol。但似乎您只想包含不包含任何元素的符号curpair

换句话说,您只想附加 if cp in symbolis Falsefor all cp

事实上,这可以通过列表推导轻松完成:

def get_pairs(tickers):
    pairs = set() # set instead of list
    
    for entry in tickers:
        symbol = entry['symbol']
        if cur in symbol and not any([cp in symbol for cp in curpair]):
            pairs.add(symbol) # note it's 'add' for sets, not append
    
    return pairs

[cp in symbol for cp in curpair]与此(故意冗长)循环相同:

cp_check = []

for cp in curpair:
    if cp in curpair:
        cp_check.append(True)
    else:
        cp_check.append(False)

所以你会得到一个列表TrueFalse值。 如果任何列表元素是 则any()返回,即它基本上与您想要的相反。因此,我们需要用 反转它的真值,如果所有列表元素都是,这将给出我们所需要的。TrueTruenotTrueFalse

于 2021-06-23T15:22:06.507 回答