Python3 匹配、反向匹配和重复数据删除

问题描述

下面代码的目的是处理两个字典,并将每个字典中匹配的 symbol添加pairs 列表中,如果该值包含 cur 中的项目,但如果不该值包含 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','BNBEUR','XRPEUR','EURBUSD','EURUSDT','SXPEUR','LINKEUR','DOTEUR','LTCEUR','ADAEUR','BCHEUR','YFIEUR','XLMEUR','GRTEUR','EOSEUR','DOGEEUR','EGLDEUR','AVAXEUR','UNIEUR','CHZEUR','ENJEUR','MATICEUR','LUNAEUR','THETAEUR','BTTEUR','HOTEUR','WINEUR','VETEUR','WRXEUR','TRXEUR','SHIBEUR','ETCEUR','SOLEUR','ICPEUR','ICPEUR']
from d2: ['ADAEUR','YFIEUR']

解决方法

使用 aggregate() 代替 set 可以轻松解决双值问题。

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

list

如果 for cp in curpair: if cp not in entry['symbol']: pairs.append(entry['symbol']) 中的任何元素缺失,这会将符号附加到列表中。例如,如果第一个 curpair 不在 cp 中,即使第二个元素 symbol 中,它也会被接受。但您似乎只想包含那些在 symbol 中包含 none 元素的符号。

换句话说,您只想在所有 curpaircp in symbolFalse 时追加。

这确实可以通过列表推导式轻松完成:

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) True 值的列表。 False 返回 any() 如果任何列表元素是 True,即,它基本上是相反的 你想要的。因此,我们需要用 True 反转它的真值,如果所有列表元素都是 not,它将为您提供 True,这正是我们需要的。