如何使用 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))