【问题标题】:Most Pythonic way to form cartesian product of two lists of strings形成两个字符串列表的笛卡尔积的最 Pythonic 方式
【发布时间】:2021-02-24 07:21:53
【问题描述】:

我有两个字符串列表:

l1 = ["Col1", "Col2", "Col3"]
l2 = ["_ad1", "_ad2"]

我想将两个列表l1 x l2 的笛卡尔积/串联成一个元素,即我想要的结果是:

["Col1_ad1", "Col1_ad2", "Col2_ad1", "Col2_ad2", "Col3_ad1", "Col1_ad1"]

我当然可以:

result = []
for colname in l1:
    for suffix in l2:
        result.append(f"{colname}{suffix}")

但我想知道是否有更pythonic的方式?

编辑:我不是在寻找一种更 Pythonic 的方式来制定循环(即列表理解)。相反,我正在寻找一个内置函数,比如 concatenate(l1, l2) 产生所需的结果

【问题讨论】:

  • 您可以使用列表理解,但由于复杂性相同,请坚持使用更容易理解的格式\debug
  • product() 来自 itertools 包,为您提供了一个元组列表,每个列表中都有一个元素。您仍然需要遍历该列表以连接元组组件。没有比列表理解更好的方法了。

标签: python string list concatenation cartesian-product


【解决方案1】:

您可以使用列表推导:

print([f"{a}{b}" for a in l1 for b in l2])

【讨论】:

    【解决方案2】:

    你可以试试列表推导:

    >>> l1 = ["Col1", "Col2", "Col3"]
    >>> l2 = ["_ad1", "_ad2"]
    >>> [f"{a}{b}" for a in l1 for b in l2]
    ['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']
    

    【讨论】:

      【解决方案3】:

      尝试列表推导:

      print([x+y for x in l1 for y in l2])
      

      你也可以使用格式字符串:

      print(["{}{}".format(x,y) for x in l1 for y in l2])
      

      仅适用于 python 3.6+(由@AlexNomane 指出):

      print([f"{x}{y}" for x in l1 for y in l2])
      

      所有输出:

      ['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']
      

      【讨论】:

        【解决方案4】:

        您可以使用itertools.product 来做到这一点

        >>> from itertools import product
        >>> l1 = ["Col1", "Col2", "Col3"]
        >>> l2 = ["_ad1", "_ad2"]
        >>> list(elem[0] + elem[1] for elem in product(l1, l2))
        ['Col1_ad1', 'Col1_ad2', 'Col2_ad1', 'Col2_ad2', 'Col3_ad1', 'Col3_ad2']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-04
          • 2012-01-03
          • 2022-01-06
          • 2020-08-23
          • 2015-08-08
          • 1970-01-01
          • 2011-07-10
          • 1970-01-01
          相关资源
          最近更新 更多