我想出了这个算法来找到 pairs
的三元组(我称它们为 trairs
),标准是所有 3 个元素(硬币),并且只有 3 个,必须存在于所有 3 个 pairs
中。
但是,可能有可能以更优雅的方式解决相同的问题。例如,我正在索引所有循环,这使它看起来更加复杂。另外,那里有一个 break
让我不舒服!
输入数据是 pairs
,它是 list
的 str
:
例如。 pairs = ['BCH/BTC','BCH/ETH','DASH/USD','BTC/USDT','ETH/BTC']
想要的输出是字符串的 list
的 list
:
例如。 trair = [['BCH/BTC','BCH/ETH','ETH/BTC]]
def find_trairs(exchange):
''' Find possible triplets of pairs (trairs) that can be traded for unbalance.
Example of trairs:
'ETC/BTC' 'ETC/ETH' 'ETH/BTC'
'BCH/BTC' 'BCH/EUR' 'BTC/EUR'
'''
exchange_pairs = exchange.symbols #loads all pairs from the exchange.
pairs = list(filter(lambda x: not '.d' in x, exchange_pairs)) #filters off
#the darkpool pairs.
pair = ['', '', '']
coin = ['', '', '']
trair = []
#Semi-optimized loop to look for triplece of pairs.
#Example:['BCH/BTC', 'BCH/EUR', 'BTC/EUR']
for i in range(len(pairs)-3):
#not all coins are 3 digits long, we must find the slash that separetes
#each coin in order to have a robust algorithm.
slash_position = pairs[i].find('/')
coin[0] = pairs[i][0:slash_position]
coin[1] = pairs[i][slash_position+1:]
for j in range(i+1, len(pairs)-2):
if (coin[0] in pairs[j]):
slash_position = pairs[j].find('/')
coin[2] = pairs[j][slash_position+1:]
for k in range(j+1, len(pairs)-1):
if coin[1] in pairs[k] and coin[2] in pairs[k]:
trair.append([pairs[i], pairs[j], pairs[k]])
break
return trair
任何提示或评论?
最佳答案
使用 itertools 排列,过滤结果并消除重复项:
import itertools
currency_pairs = ['BCH/BTC', 'BCH/ETH', 'DASH/USD', 'BTC/USDT', 'ETH/BTC']
set_triplets = set()
for triplet in itertools.permutations(currency_pairs, 3):
c1, c2 = triplet[0].split('/')
if (c1 in triplet[1] or c1 in triplet[2]) and (c2 in triplet[1] or c2 in triplet[2]):
set_triplets.add(tuple(sorted(triplet)))
for triplet in set_triplets:
print(triplet)
输出:
('BCH/ETH', 'BTC/USDT', 'ETH/BTC')
('BCH/BTC', 'BCH/ETH', 'BTC/USDT')
('BCH/BTC', 'BCH/ETH', 'ETH/BTC')
请注意,三元组中货币对的顺序是按字典序升序排列的,不要指望第一对始终是其他两个之间的链接。
关于python - 在列表中查找组合的更优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51166586/