假设我有一个元组列表
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
的各种解决方案之外,我还查看了其他类似问题的答案,但我无法找到该问题的解决方案。
您可以使用带有嵌套循环的列表理解,将元素分散在
foo
:
[(*f, b) for f in foo for b in bar]
你的情况确实很棘手,
zip
或itertools.product
不能完成这项工作,因为你想将一个元组和一个元素连接成一个包含所有元素的元组。
在一行中,您可以使用 unpacking:
expected_result = [(*i, j) for i in foo for j in bar]
假设,如您的示例中所示,
foo
是元组列表,bar
是元素列表。