【问题标题】:Python3 match, reverse match and dedupePython3 匹配、反向匹配和去重
【发布时间】:2021-09-06 23:18:22
【问题描述】:

以下代码的目的是处理两个字典,如果值包含 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']

【问题讨论】:

  • 您介意提供一个输入示例吗?这真的有助于理解你想要做什么。编辑:好的,我找到了链接哈哈,最好包含一个示例输入以供将来参考,因为将来可能无法使用外部源。
  • 毫无疑问,内联更好。我不确定到底有多少输出适合我试图做的事情,并带有适当的输入示例。我决定谨慎行事并将其全部链接起来。不过我很欣赏你的观点。谢谢。

标签: python string-matching python-dedupe


【解决方案1】:

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

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

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

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

换句话说,如果cp 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)

因此您将获得TrueFalse 值的列表。 any() 返回True 如果任何列表元素是True,即它基本上是相反的 你想要什么。因此我们需要用not 反转它的真值,如果所有列表元素都是False,这将给你True,这正是我们需要的。

【讨论】:

  • 感谢您的回复。感谢您详细解释这背后的逻辑。这很有意义,现在可以完美运行。
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
相关资源
最近更新 更多