代码之家  ›  专栏  ›  技术社区  ›  Jim Fell

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

  •  0
  • Jim Fell  · 技术社区  · 1 年前

    假设我有一个元组列表 foo (object,integer)和对象列表 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 ,我也看了其他类似问题的答案,但我无法找到这个问题的解决方案。

    3 回复  |  直到 1 年前
        1
  •  3
  •   e-motta    1 年前

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

    [(*f, b) for f in foo for b in bar]
    
        2
  •  2
  •   Gugu72    1 年前

    你的案子确实很棘手,而且 zip itertools.product 不要做这项工作,因为您希望将一个元组和一个元素连接到一个包含所有元素的元组中。 在一行中,您可以使用 unpacking :

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

    假设,就像你的例子一样 foo 是元组的列表,并且 bar 是元素列表。

        3
  •  -1
  •   lfalin    1 年前

    您可以使用 product 中的函数 itertools 库可以通过几种不同的方式做到这一点:

    import itertools
    
    foo = [("A", 1), ("B", 2)]
    bar = ["X", "Y"]
    
    # Iterating over the product generator with a for loop
    magicOne = []
    for d in itertools.product(foo, bar):
        magicOne.append( (*d[0], d[1]) )
    
    # Using a list comprehension
    magicTwo = [ (*d[0], d[1]) for d in itertools.product(foo, bar) ]
    
    print(magicOne)
    print(magicTwo)
    

    这两者都打印: [('A', 1, 'X'), ('B', 2, 'X')]

    简要说明

    这个 product 函数是标准库的一部分,它为您提供了所提供的任何迭代的笛卡尔乘积。

    它返回一个生成器,然后可以在循环上下文中使用,例如在 for 循环或列表理解。

    此行: (*d[0], d[1]) 是键,因为它打开产品中的第一个项(元组),将其与产品中的第二个项(列表项)组合,并将它们组合成一个新的元组。

    请注意,我在这里使用了字符串和int来保持事物的自包含性,但如果您有名为 A B 等定义,并使用:

    foo = [(A, i), (B, j)]
    bar = [X]