gpt4 book ai didi

python - 生成一个字符串列表的所有组合,同时包含两个括号和一个被置换的运算符

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:30 26 4
gpt4 key购买 nike

假设我有一个字符串列表:l = ['A','B','C','D']

我知道要通过替换生成这些组合的所有组合,选择 n,我会使用 itertools.combinations 库方法来获取它们。

例如,list(combinations(l, 2)) 会给我

[['A','B'], ['A','C'],['A','D'],['B','C'],['B ','D'],['C','D']]

但是,我想要括号而不是括号:

['(A,B)', '(A,C)','(A,D)','(B,C)','(B,D)','(C ,D)']

现在,假设我想扩展它并为这些 ANDOR 添加两个操作:

这样我就可以得到 ['(A','AND','B)', '(A','OR','B)',etc.]

进一步扩展,在 n=3 的情况下获得嵌套括号:

['((A','AND','B)', 'AND', 'C)', '((A','AND','B)', 'OR', 'C)', '((A','OR','B)', 'OR', 'C)', '((A','OR','B)', 'AND', 'C)', etc.]

理想的形式是:

['((A AND B) AND C)', '((A AND B) OR C)', '((A OR B) OR C)', '((A OR B) AND C)', etc.]

因此,总而言之,我一次选择一个 n 列表元素的组合,对运算符 ['AND', 'OR'] 进行排列并从左侧添加嵌套。

我在 JavaScript 中做过类似的事情,但它更容易,因为用户会构造实际的句子。它不是从一组排列和组合中创建的。

最佳答案

您可以使用 itertools.combinations 从给定列表中选择操作数,使用 itertools.product 生成运算符组合,并使用 itertools.product 再次生成操作数和运算符的所有混合,并使用 for 循环根据所选操作数和运算符保持嵌套列表以构建所需的输出:

from itertools import combinations, product
def expressions(l, n):
for (operations, *operands), operators in product(
combinations(l, n), product(('AND', 'OR'), repeat=n - 1)):
for operation in zip(operators, operands):
operations = [operations, *operation]
yield operations

因此 list(expressions(['A','B','C','D'], 3)) 返回:

[[['A', 'AND', 'B'], 'AND', 'C'],
[['A', 'AND', 'B'], 'OR', 'C'],
[['A', 'OR', 'B'], 'AND', 'C'],
[['A', 'OR', 'B'], 'OR', 'C'],
[['A', 'AND', 'B'], 'AND', 'D'],
[['A', 'AND', 'B'], 'OR', 'D'],
[['A', 'OR', 'B'], 'AND', 'D'],
[['A', 'OR', 'B'], 'OR', 'D'],
[['A', 'AND', 'C'], 'AND', 'D'],
[['A', 'AND', 'C'], 'OR', 'D'],
[['A', 'OR', 'C'], 'AND', 'D'],
[['A', 'OR', 'C'], 'OR', 'D'],
[['B', 'AND', 'C'], 'AND', 'D'],
[['B', 'AND', 'C'], 'OR', 'D'],
[['B', 'OR', 'C'], 'AND', 'D'],
[['B', 'OR', 'C'], 'OR', 'D']]

关于python - 生成一个字符串列表的所有组合,同时包含两个括号和一个被置换的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com