python - 使用元组创建元组组

标签 python

让我们考虑以下元组列表:

[('AUD', 'M6A'),
 ('CHF', 'E7'),
 ('CHF', 'EUR'),
 ('CHF', 'M6E'),
 ('E7', 'CHF'),
 ('E7', 'EUR'),
 ('E7', 'M6E'),
 ('EMD', 'ES'),
 ('EMD', 'RTY'),
 ('ES', 'EMD'),
 ('ES', 'NQ'),
 ('EUR', 'CHF'),
 ('EUR', 'E7'),
 ('EUR', 'M6E'),
 ('GBP', 'M6B'),
 ('GF', 'LE'),
 ('LE', 'GF'),
 ('M6A', 'AUD'),
 ('M6B', 'GBP'),
 ('M6E', 'CHF'),
 ('M6E', 'E7'),
 ('M6E', 'EUR'),
 ('NIY', 'NKD'),
 ('NKD', 'NIY'),
 ('NQ', 'ES'),
 ('RTY', 'EMD')]

我想从中创建一个列表列表,将至少出现一次的符号聚集在一起。

例如 ('CHF', 'EUR')('E7', 'EUR') 将合并到 1 个列表 ['CHF '、'EUR'、'E7'] 等等。

知道如何实现这一目标吗?

<小时/>

对于那些询问的人,这里是执行此操作的循环想法:

groups=[[]]
for item in li:
    for group in groups:
        if item[0] in group or item[1] in group:
            group.append(item)
        else:
            groups.append([item])

非常慢而且丑陋 - 实际上它的内存使用量让我的机器震惊了。

预期结果为[{'AUD', 'M6A'}, {'CHF', 'E7', 'EUR', 'M6E'}, {'EMD', 'ES', 'NQ ', 'RTY'}, {'GBP', 'M6B'}, {'GF', 'LE'}, {'NIY', 'NKD'}]

最佳答案

您正在寻找不相交的图,可以使用 networkx 来解决:

In []:
import networkx as nx
edges = [('AUD', 'M6A'), ('CHF', 'E7'), ('CHF', 'EUR'), ...]
g = nx.Graph(edges)
list(nx.connected_components(g))

Out[]:
[{'AUD', 'M6A'},
 {'CHF', 'E7', 'EUR', 'M6E'},
 {'EMD', 'ES', 'NQ', 'RTY'},
 {'GBP', 'M6B'},
 {'GF', 'LE'},
 {'NIY', 'NKD'}]

​如果您想避免使用 networkx 您可以自己合理有效地编写它(这应该是 O(n) 来创建图形和 O( n) 创建不相交的集合 - 总体来说是 O(n)) 例如:

In []:
g = {}
for a, b in edges:
    g.setdefault(a, []).append(b)
    g.setdefault(b, []).append(a)

r = []
while g:
    s = set()
    q = [next(iter(g))]
    while q:
        k = q.pop()
        if k in s:
            continue
        s.add(k)
        for e in g.pop(k):
            q.append(e)
    r.append(s)
r

Out[]:
[{'AUD', 'M6A'},
 {'CHF', 'E7', 'EUR', 'M6E'},
 {'EMD', 'ES', 'NQ', 'RTY'},
 {'GBP', 'M6B'},
 {'GF', 'LE'},
 {'NIY', 'NKD'}]

关于python - 使用元组创建元组组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535024/

相关文章:

python - numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 之间的区别

c++ - 计算文件的熵

python - lambdify 返回类型错误 : _lambdifygenerated() missing 1 required positional argument: 'k'

php - PHP 中 crc32b 的输出不等于 Python

python - 我得到了查询集,如何获取相关对象?

python - 如何从 django View 运行unitest和selenium?

python - for 循环仅在 __str__ 语句期间迭代到 NoneType?

python - 使用numpy将两个数组垂直合并为元组数组

python - 如何使用 Python 和 MySQL 连接器检索数据

python - ValueError : Error when checking input: expected conv2d_36_input to have shape (3, 32, 32) 但得到形状为 (1, 10, 10) 的数组