如何解决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 元素的符号。
换句话说,您只想在所有 curpair
的 cp in symbol
为 False
时追加。
这确实可以通过列表推导式轻松完成:
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
,这正是我们需要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。