Python3 匹配、反向匹配和去重

Python3 match, reverse match and dedupe

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

我成功匹配了 cur 的值,但我不知道如何对 curpair 中的项目进行反向匹配。此外,第二个问题是它似乎创建了重复项,可能是因为额外的 for 循环与 curpair 中的项目进行比较。无论哪种方式,我不确定是否有一种在线重复数据删除的方法,或者是否需要另一个例程。

我确信可能有一种方法可以做到所有这些,同时通过列表理解来简化代码,但也许没有。我试图理解列表理解只会让我放心,我的 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']

使用 set 而不是 list 可以轻松解决双精度值的问题。

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

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

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

中元素的 none 的符号

换句话说,如果 cp in symbol 对所有 cpFalse,您只想追加。

这确实可以通过列表理解轻松完成:

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() returns True 如果任何列表元素是 True,即,它基本上做相反的事情 你想要什么。因此,我们需要用 not 反转它的真值,如果所有列表元素都是 False,这将给你 True,这正是我们需要的。