如何使用 Python 中的高效嵌套产生所有可能性?
How to yield all possibilities using efficient nesting in Python?
外汇三角套利问题:
我目前正在尝试解决如何生成 Dictionary.items() 的所有元素的有效方法。假设数组的长度为 N,我需要获取所有可能的组合,其中 [[A,B],[A,C],[C,B]...]
目前由于嵌套,效率不高
def Arb(tickers: dict) -> list:
for first_pair in tickers.items():
pair1: list = first_pair[0].split("/")
for second_pair in tickers.items():
pair2: list = second_pair[0].split("/")
if pair2[0] == pair1[0] and pair2[1] != pair1[1]:
for third_pair in tickers.items():
pair3: list = third_pair[0].split("/")
if pair3[0] == pair2[1] and pair3[1] == pair1[1]:
id1 = first_pair[1]["id"]
id2 = second_pair[1]["id"]
id3 = third_pair[1]["id"]
yield [pair1, id1, pair2, id2, pair3, id3]
如何 efficient/pythonic 来 return 包含所有可能项目的列表?
这是一个例子
tickers = {"EZ/TC": {
"id": 1
},
"LM/TH": {
"id": 2
},
"CD/EH": {
"id": 3
},
"EH/TC": {
"id":4
},
"LM/TC": {
"id": 5
},
"CD/TC":{
"id": 6
},
"BT/TH": {
"id": 7,
},
"BT/TX": {
"id": 8,
},
"TX/TH":{
"id": 9
}
}
print(list(Arb(tickers)))
[(['CD', 'TC'], 6, ['CD', 'EH'], 3, ['EH', 'TC'], 4), (['BT', 'TH'], 7, ['BT', 'TX'], 8, ['TX', 'TH'], 9)]
输出是一个包含 "lists" 所有可能性的单一列表。
Itertools.permutations 和 itertools.combinations 可能有助于解决此类问题:https://docs.python.org/3/library/itertools.html
这是一个 link,其中包含一个使用 itertools.permutations 的示例:
https://www.geeksforgeeks.org/python-itertools-permutations/
您不需要迭代 items()
,因为您不使用值,只使用键。然后你想使用 itertools.permutations
来获得每对的每个顺序的所有组合,然后保留匹配字母的组合
def verify(v1, v2, v3):
return v1[0] == v2[0] and v1[1] == v3[1] and v2[1] == v3[0]
def arb(tickers) -> List:
c = permutations([x.split("/") for x in tickers], r=3)
return list(filter(lambda x: verify(*x), c))
外汇三角套利问题:
我目前正在尝试解决如何生成 Dictionary.items() 的所有元素的有效方法。假设数组的长度为 N,我需要获取所有可能的组合,其中 [[A,B],[A,C],[C,B]...]
目前由于嵌套,效率不高
def Arb(tickers: dict) -> list:
for first_pair in tickers.items():
pair1: list = first_pair[0].split("/")
for second_pair in tickers.items():
pair2: list = second_pair[0].split("/")
if pair2[0] == pair1[0] and pair2[1] != pair1[1]:
for third_pair in tickers.items():
pair3: list = third_pair[0].split("/")
if pair3[0] == pair2[1] and pair3[1] == pair1[1]:
id1 = first_pair[1]["id"]
id2 = second_pair[1]["id"]
id3 = third_pair[1]["id"]
yield [pair1, id1, pair2, id2, pair3, id3]
如何 efficient/pythonic 来 return 包含所有可能项目的列表?
这是一个例子
tickers = {"EZ/TC": {
"id": 1
},
"LM/TH": {
"id": 2
},
"CD/EH": {
"id": 3
},
"EH/TC": {
"id":4
},
"LM/TC": {
"id": 5
},
"CD/TC":{
"id": 6
},
"BT/TH": {
"id": 7,
},
"BT/TX": {
"id": 8,
},
"TX/TH":{
"id": 9
}
}
print(list(Arb(tickers)))
[(['CD', 'TC'], 6, ['CD', 'EH'], 3, ['EH', 'TC'], 4), (['BT', 'TH'], 7, ['BT', 'TX'], 8, ['TX', 'TH'], 9)]
输出是一个包含 "lists" 所有可能性的单一列表。
Itertools.permutations 和 itertools.combinations 可能有助于解决此类问题:https://docs.python.org/3/library/itertools.html
这是一个 link,其中包含一个使用 itertools.permutations 的示例: https://www.geeksforgeeks.org/python-itertools-permutations/
您不需要迭代 items()
,因为您不使用值,只使用键。然后你想使用 itertools.permutations
来获得每对的每个顺序的所有组合,然后保留匹配字母的组合
def verify(v1, v2, v3):
return v1[0] == v2[0] and v1[1] == v3[1] and v2[1] == v3[0]
def arb(tickers) -> List:
c = permutations([x.split("/") for x in tickers], r=3)
return list(filter(lambda x: verify(*x), c))