如何在Python中将对象列表组合成元组列表(矩阵样式)?

问题描述 投票:0回答:2

假设我有一个元组列表

foo
(对象,整数)和一个对象列表
bar
。每个父列表的长度都是可变的。如何将它们组合成单个元组列表,其中每个元组都是两个父列表中每个元素的唯一组合?

  • 示例1:

    foo = [(A, i)]
    bar = [X, Y]
    # missing magic
    expected_result = [(A, i, X), (A, i, Y)]
    
  • 示例2:

    foo = [(A, i), (B, j)]
    bar = [X, Y]
    # missing magic
    expected_result = [(A, i, X), (A, i, Y), (B, j, X), (B, j, Y)]
    
  • 示例3:

    foo = [(A, i), (B, j), (C, k)]
    bar = [X, Y]
    # missing magic
    expected_result = [(A, i, X), (A, i, Y), (B, j, X), (B, j, Y), (C, k, X), (C, k, Y)]
    
  • 示例4:

    foo = [(A, i), (B, j)]
    bar = [X]
    # missing magic
    expected_result = [(A, i, X), (B, j, X)]
    

如果可能的话,我希望在一行中完成此操作。结果列表的顺序并不重要,但该列表的元组中元素的顺序需要是可预测的。

除了尝试使用

itertools.product
zip
的各种解决方案之外,我还查看了其他类似问题的答案,但我无法找到该问题的解决方案。

python tuples
2个回答
1
投票

您可以使用带有嵌套循环的列表理解,将元素分散在

foo
:

[(*f, b) for f in foo for b in bar]

1
投票

你的情况确实很棘手,

zip
itertools.product
不能完成这项工作,因为你想将一个元组和一个元素连接成一个包含所有元素的元组。 在一行中,您可以使用 unpacking:

expected_result = [(*i, j) for i in foo for j in bar]

假设,如您的示例中所示,

foo
是元组列表,
bar
是元素列表。

© www.soinside.com 2019 - 2024. All rights reserved.