gpt4 book ai didi

python - 将成对列表转换为与第一个共享最后一个项目的成对列表,反之亦然

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:05 25 4
gpt4 key购买 nike

我有一个元组列表,例如 li = [('aa', 'bb'), ('bb','cc'), ('dd', 'ee')] .从 li 我想生成一个元组对列表,其中 li 中一个元组的第一个元素等于 li< 另一个元素中的第二个元素。在此处的示例中,输出列表将是一个包含一对元组的列表:

[(('aa', 'bb'), ('bb', 'cc'))]

这对于简短的 li 列表来说已经足够简单了。例如,我已经通过类似的方式完成了

joints = []
for pair in itertools.permutations(li, r=2):
if pair[0][1] == pair[1][0]:
joints += ((pair[0][0], pair[0][1]), (pair[1][0], pair[1][1]))

但是,对于长列表 li,所有长度为 2 的排列的总数会迅速爆炸并变得难以管理。

我认为必须有更可行的方法来做到这一点,也许使用矩阵乘法或哈希表。对于更长(例如 5000 多个长度)的列表,执行此操作的合理方法是什么?

最佳答案

您可以使用字典来收集预期的对。作为一种更 pythonic 的方法,您可以使用 collections 模块中的 defaultdict()deque 函数,以便为每一对保留相关对在 deque 中:

>>> from collections import defaultdict, deque
>>> d = defaultdict(deque)

>>> for i, j in li:
... for k, t in li:
... if (i, j) != (k, t) and (i == t or j == k):
... d[(i, j)].append((k, t))
...
>>>
>>> d
defaultdict(<type 'collections.deque'>,
{('dd', 'ee'): deque([('ee', 'mm')]),
('rr', 'cc'): deque([('cc', 'tt')]),
('cc', 'tt'): deque([('bb', 'cc'), ('rr', 'cc')]),
('aa', 'bb'): deque([('bb', 'cc')]),
('ee', 'mm'): deque([('dd', 'ee')]),
('bb', 'cc'): deque([('aa', 'bb'), ('cc', 'tt')])})

为了创建所需的元组列表,您可以通过遍历字典项来使用列表理解:

>>> [[(k, v) for v in values] for k, values in d.items()]
[[(('dd', 'ee'), ('ee', 'mm'))], [(('rr', 'cc'), ('cc', 'tt'))], [(('cc', 'tt'), ('bb', 'cc')), (('cc', 'tt'), ('rr', 'cc'))], [(('aa', 'bb'), ('bb', 'cc'))], [(('ee', 'mm'), ('dd', 'ee'))], [(('bb', 'cc'), ('aa', 'bb')), (('bb', 'cc'), ('cc', 'tt'))]]

请注意,如果您不想对结果做任何额外的操作,您可以简单地使用 list 作为您的 defaultdict 的函数,但是如果您想要做对结果进行更多操作,例如弹出、在两侧附加、旋转等。deque 是一个不错的选择,因为它为您提供了大多数操作的恒定顺序。

itertools.permutations 更简洁的方式:

>>> from itertools import permutations
>>> for i, j permutations(li, 2):
... if (i == t or j == k):
... d[(i, j)].append((k, t))

关于python - 将成对列表转换为与第一个共享最后一个项目的成对列表,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37331738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com