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
对所有 cp
是 False
,您只想追加。
这确实可以通过列表理解轻松完成:
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()
returns True
如果任何列表元素是 True
,即,它基本上做相反的事情
你想要什么。因此,我们需要用 not
反转它的真值,如果所有列表元素都是 False
,这将给你 True
,这正是我们需要的。
下面代码的目的是处理两个字典,如果值包含 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
.
换句话说,如果 cp in symbol
对所有 cp
是 False
,您只想追加。
这确实可以通过列表理解轻松完成:
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()
returns True
如果任何列表元素是 True
,即,它基本上做相反的事情
你想要什么。因此,我们需要用 not
反转它的真值,如果所有列表元素都是 False
,这将给你 True
,这正是我们需要的。