【问题标题】:List multiplication列表乘法
【发布时间】:2011-01-11 07:23:02
【问题描述】:

我有一个列表 L = [a, b, c] 我想生成一个元组列表:

[(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)...] 

我试过做 L * L 但没用。谁能告诉我如何在 python 中得到它。

【问题讨论】:

  • 这种“产品”也称为“笛卡尔产品”或“直接产品”(我不确定一个术语或另一个术语是否更合适,但 Python 文档本身使用“笛卡尔积。”)

标签: python list cartesian-product


【解决方案1】:

最老式的做法是:

def perm(L):
    result = []
    for i in L:
        for j in L:
            result.append((i,j))
    return result

它的运行时间为 O(n^2),因此速度很慢,但您可以认为它是“老式”风格的代码。

【讨论】:

  • 所有实现这一点的方法最多只有 O(n^2) 运行时间,原因是它们都必须生成 O(n^2) 元组。使用诸如 itertools 之类的迭代器可以让您推迟其中的一些工作,但您不能完全避免它。您的方法甚至可能是 O(n^3) - 由于内存重新分配问题,附加到列表很可能是 O(n) 而不是 O(1),尽管我不确定。我认为 Python 列表使用可调整大小的数组-不是 链接列表。不过,可能会有某种附加优化。列表解析可能在开始时预分配整个数组。
【解决方案2】:

你可以通过列表理解来做到这一点:

[ (x,y) for x in L for y in L]

编辑

您也可以按照其他人的建议使用 itertools.product,但前提是您使用的是 2.6 及更高版本。列表推导适用于 2.0 以后的所有 Python 版本。如果您确实使用了 itertools.product,请记住它返回的是生成器而不是列表,因此您可能需要对其进行转换(取决于您想用它做什么)。

【讨论】:

    【解决方案3】:

    两种主要选择:

    >>> L = ['a', 'b', 'c']
    >>> import itertools
    >>> list(itertools.product(L, L))
    [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
    >>> [(one, two) for one in L for two in L]
    [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
    >>> 
    

    前者需要 Python 2.6 或更高版本 - 后者几乎适用于您可能绑定的任何 Python 版本。

    【讨论】:

    • 如果您只是要直接转换为列表,那么使用 itertools 对我来说似乎很奇怪。列表推导可能更有效,可读性更强,并且可能更易于维护,因为您可以直接对表达式进行调整。更多的抽象意味着更多的不灵活,关键是隐藏你希望(但不能确定)你永远不需要再担心的细节。
    【解决方案4】:

    好的,我试过了:

    L2 = [(x,y) for x in L for x in L] 得到 L 平方。

    这是最好的pythonic方式吗?我希望 L * L 在 python 中工作。

    【讨论】:

    • 错误的期望——sequence * sequence 没有被定义(只有sequence * int,它的作用非常不同!-)。
    • 糟糕,在我看到答案之前写了这个。请忽略
    【解决方案5】:

    x = [a,b,c] y = [] 对于 x 中的项目: 对于 x 中的第 2 项: y.append((item, item2))

    也许不是 Pythonic 的方式,但可以工作

    【讨论】:

      【解决方案6】:

      itertools 模块包含许多对这类事情有用的函数。看起来你可能正在寻找product

      >>> import itertools
      >>> L = [1,2,3]
      >>> itertools.product(L,L)
      <itertools.product object at 0x83788>
      >>> list(_)
      [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
      

      【讨论】:

        【解决方案7】:

        看看itertools 模块,它提供了一个product 成员。

        L =[1,2,3]
        
        import itertools
        res = list(itertools.product(L,L))
        print(res)
        

        给予:

        [(1,1),(1,2),(1,3),(2,1), ....  and so on]
        

        【讨论】:

          猜你喜欢
          • 2020-05-30
          • 1970-01-01
          • 1970-01-01
          • 2011-12-13
          • 2020-10-22
          • 1970-01-01
          • 2019-02-10
          • 1970-01-01
          • 2015-10-14
          相关资源
          最近更新 更多