【问题标题】:Python combinactions via list comprehension with variable input array通过列表推导与可变输入数组进行 Python 组合
【发布时间】:2021-12-26 15:30:22
【问题描述】:

动态列表理解

固定大小列表的解决方案

假设我有一个列表array=['abc','def','ghi'],我想计算所有不同的组合,即comb=['adg','adh','adi','bdg',...]没有使用itertools.combinations

这是可能的,例如通过result = [(x+y+z) for x in pos[0] for y in pos[1] for z in pos[2]]

可变列表大小的问题

如何用可变长度数组列表重写列表推导,例如result= [(a+b+c+...) for a in pos[0] for ... for z in pos[-1]?

【问题讨论】:

  • "不使用 ..." 为什么?无论如何,研究zip
  • 使用itertools.product
  • @DeepSpace 我看不出zip 在这里有什么帮助。

标签: python list list-comprehension combinations itertools


【解决方案1】:

您实际上是在寻找这些字符串的乘积(本身不是组合)。

这将是一个复杂的列表理解,但这里是:

L=['abc','def','ghi']

R = [ "".join(s[i//b%len(s)] for s,b in zip(L,base))
      for base in [[1]] if [base.extend(base[-1]*len(s) for s in L)]
      for i in range(base[-1])]

print(R)
['adg', 'bdg', 'cdg', 'aeg', 'beg', 'ceg', 'afg', 'bfg', 'cfg',
 'adh', 'bdh', 'cdh', 'aeh', 'beh', 'ceh', 'afh', 'bfh', 'cfh', 
 'adi', 'bdi', 'cdi', 'aei', 'bei', 'cei', 'afi', 'bfi', 'cfi']

for base ... 部分是一个技巧,用于获取未排序结果的内部乘数列表,同时使用 0 到字符串长度 (i) 乘积的索引顺序访问它。

如果你想要字符串顺序的结果,你可以这样写:

R = [ "".join(s[i//b%len(s)] for s,b in zip(L,base[1:]))
      for base in [[1]] if [base.insert(0,base[0]*len(s)) for s in L[::-1]]
      for i in range(base[0])]

print(R)
['adg', 'adh', 'adi', 'aeg', 'aeh', 'aei', 'afg', 'afh', 'afi', 
 'bdg', 'bdh', 'bdi', 'beg', 'beh', 'bei', 'bfg', 'bfh', 'bfi',
 'cdg', 'cdh', 'cdi', 'ceg', 'ceh', 'cei', 'cfg', 'cfh', 'cfi']

这给出了与["".join(p) for p in itertools.product(*L)] 相同的结果,尽管效率不高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多