代码之家  ›  专栏  ›  技术社区  ›  Nico Schlömer David Maze

从子列表中获取所有对,其中没有一对单独来自一个子列表

  •  0
  • Nico Schlömer David Maze  · 技术社区  · 6 年前

    我有很多列表,上面有很多元素,

    lists = [
        ["a", "b", "c"],
        [7, 1, 2, 3, 5],
        ["alpha", "gamma"],
        # ...
    ]
    

    现在,我想创建上面列表中所有元素对的列表,即,

    combinations = [
        ["a", 7],
        ["a", 1],
        # ...
        ["c", "gamma"],
        [7, "alpha"],
        # ...
    ]
    

    条件是对的两个元素都来自不同的子列表。排序并不重要,因此 ["a", 7] [7, "a"] 就够了。

    有什么提示吗?(也许是从 itertools ?)

    3 回复  |  直到 6 年前
        1
  •  3
  •   pault Tanjin    6 年前

    以下是一种方法:将两个列表组合在一起。然后做一个组合的乘积。

    from itertools import product, combinations, chain
    res = list(chain.from_iterable(product(a, b) for a, b in combinations(lists, 2)))
    
    print(res)
    [('a', 7),
     ('a', 1),
     ('a', 2),
     ('a', 3),
     ('a', 5),
     ('b', 7),
     ('b', 1),
     ('b', 2),
     ('b', 3),
     ('b', 5),
     ('c', 7),
     ('c', 1),
     ('c', 2),
     ('c', 3),
     ('c', 5),
     ('a', 'alpha'),
     ('a', 'gamma'),
     ('b', 'alpha'),
     ('b', 'gamma'),
     ('c', 'alpha'),
     ('c', 'gamma'),
     (7, 'alpha'),
     (7, 'gamma'),
     (1, 'alpha'),
     (1, 'gamma'),
     (2, 'alpha'),
     (2, 'gamma'),
     (3, 'alpha'),
     (3, 'gamma'),
     (5, 'alpha'),
     (5, 'gamma')]
    
        2
  •  3
  •   rafaelc    6 年前

    itertools.combinations + itertools.product set 理解删除重复项

    {item for z in (itertools.combinations(x, 2) for x in itertools.product(*lists)) for item in z}
    
    
    {('a', 'alpha'),
     ('a', 'gamma'),
     ('a', 1),
     ('a', 2),
     ('a', 3),
     ('a', 5),
     ('a', 7),
     ('b', 'alpha'),
     ('b', 'gamma'),
     ('b', 1),
     ('b', 2),
     ('b', 3),
     ('b', 5),
     ('b', 7),
     ('c', 'alpha'),
     ('c', 'gamma'),
     ('c', 1),
     ('c', 2),
     ('c', 3),
     ('c', 5),
     ('c', 7),
     (1, 'alpha'),
     (1, 'gamma'),
     (2, 'alpha'),
     (2, 'gamma'),
     (3, 'alpha'),
     (3, 'gamma'),
     (5, 'alpha'),
     (5, 'gamma'),
     (7, 'alpha'),
     (7, 'gamma')}
    
        3
  •  1
  •   Nico Schlömer David Maze    6 年前

    多亏了@domochevksi的评论:

    n = len(lists)
    combinations = [
        [item0, item1]
        for i in range(n)
        for j in range(i+1, n)
        for item0 in lists[i]
        for item1 in lists[j]
        ]