首页 > 解决方案 > 如何使用python编写代码以将列表中的列表与特定逻辑合并

问题描述

我需要一些帮助来编写下面在 python 3.6 中提到的特定逻辑。

假设我有一个列表“a”。请注意,此列表不是静态长度,并且值可能会有所不同。

a= ['Theresa', 'Paul', 'lyndsay', 'Nick', 'Tim', 'Ray', 'Charles']

我想使用这些值生成如下列表:

(((((name equals "Theresa") or (name equals "Paul")) or ((name equals "lyndsay") or (name equals "Nick"))) or ((name equals "Tim") or (name equals "Ray"))) or (name equals "Charles"))

这样做的逻辑是,如果您注意到括号,它们总是一次比较 2 个条件。

下面的第一组:如果你看到它比较了 2 个值。

((name equals "Theresa") or (name equals "Paul"))

同样的第二组是:

((name equals "lyndsay") or (name equals "Nick"))

现在我们有 2 套,可以将它们组合并用括号包裹在一起。这现在变成了一个可以与另一个集合组合的集合。让我们称之为设置 3

(((name equals "Theresa") or (name equals "Paul")) or ((name equals "lyndsay") or (name equals "Nick")))

继续前进,下一组 4 将是:

((name equals "Tim") or (name equals "Ray"))

现在 set 3 和 set 4 可以组合并用括号包裹在一起。这是第 5 组:

((((name equals "Theresa") or (name equals "Paul")) or ((name equals "lyndsay") or (name equals "Nick"))) or ((name equals "Tim") or (name equals "Ray")))

接下来我们只剩下 1 个值,所以这成为我们的最后一组:

(name equals "Charles")

现在可以将这与 set 5 结合起来,以获得从列表“a”生成的最终字符串:

(((((name equals "Theresa") or (name equals "Paul")) or ((name equals "lyndsay") or (name equals "Nick"))) or ((name equals "Tim") or (name equals "Ray"))) or (name equals "Charles"))

同样列表'b'应该生成:

b= ['key1', 'key2', 'key3', 'key4','key5']

((((keyword equals "key1") or (keyword equals "key2")) or ((keyword equals "key3") or (keyword equals "key4"))) or (keyword equals "key5"))

列表 'a' 和 'b' 中的 2 应使用 'and' 运算符组合以给出:

((((((name equals "Theresa") or (name equals "Paul")) or ((name equals "lyndsay") or (name equals "Nick"))) or ((name equals "Tim") or (name equals "Ray"))) or (name equals "Charles")) and ((((keyword equals "key1") or (keyword equals "key2")) or ((keyword equals "key3") or (keyword equals "key4"))) or (keyword equals "key5")))

到目前为止,我已经尝试过使用以下代码生成一个列表。但不知道如何进一步进行:

from math import ceil

size = 2
seq = ['Theresa', 'Paul', 'lyndsay', 'Nick', 'Tim', 'Ray', 'Charles']

split_list = [
    seq[i * size:(i * size) + size]
    for i in range(ceil(len(seq) / size))
]

# print(split_list)
mid_list = []
qs = ""

for i, item in enumerate(split_list):
    sub_q = ""
    if i > 0:
        sub_q = f'{qs} or '

    if len(item) == 2:
        sub_q = f'((name equals "{item[0]}") or (name equals "{item[1]}"))'
    else:
        sub_q = f'(name equals "{item[0]}"))'

    mid_list.append([sub_q])
print(mid_list)

Output: [['((name equals "Theresa") or (name equals "Paul"))'], ['((name equals "lyndsay") or (name equals "Nick"))'], ['((name equals "Tim") or (name equals "Ray"))'], ['(name equals "Charles"))']]

感谢您对此的任何帮助。

谢谢你。

标签: python-3.xlistlist-comprehension

解决方案


我设法按照我的逻辑编写了以下代码来生成字符串。

from math import ceil

size = 2
seq = ['Theresa', 'Paul', 'lyndsay', 'Nick', 'Tim', 'Ray']

odd_length = len(seq) % 2
original_length = len(seq)

split_list = [
    seq[i * size:(i * size) + size]
    for i in range(ceil(len(seq) / size))
]

# print(split_list)
mid_list = []
qs = ""

for i, item in enumerate(split_list):
    sub_q = ""
    if i > 0:
        sub_q = f'{qs} or '

    if len(item) == 2:
        sub_q = f'((name contains "{item[0]}") or (name contains "{item[1]}"))'
    elif original_length == 1:
            sub_q = f'(name contains "{item[0]}")'
    else:
        sub_q = f'(name contains "{item[0]}"))'

    mid_list.append([sub_q])

a = mid_list

while len(mid_list) != 1:
    a = []
    if len(mid_list) > 2:
        q = f'({mid_list[0][0]} or {mid_list[1][0]})'
        a.append([q])
        for i in range(len(mid_list)):
            if i > 1:
                a.append(mid_list[i])
        mid_list = a
    elif len(mid_list) == 2 and odd_length == 1:
        q = f'({mid_list[0][0]} or {mid_list[1][0]}'
        a.append([q])
        for i in range(len(mid_list)):
            if i > 1:
                a.append(mid_list[i])
        mid_list = a
    else:
        q = f'({mid_list[0][0]} or {mid_list[1][0]})'
        a.append([q])
        for i in range(len(mid_list)):
            if i > 1:
                a.append(mid_list[i])
        mid_list = a


print(a[0][0])

推荐阅读