具有可变成员的列表列表的产品

Product of lists of lists with variable members

说我有这个输入数据

my_input_list = [[A],[A,B,C],[D],[D,E,F],[A,B,C,D,E,F],[A,C,E]]
items_that_appear_twice = [A,B,C]
items_that_appear_four = [D,E,F]

而且我想创建一个扩展,使某些元素只允许出现两次。

my_output_list = [
[A],[A],
[A,B,C],[A,B,C],
[D],[D],[D],[D],
[D,E,F],[D,E,F],[D,E,F],[D,E,F],
[A,B,C,D,E,F],[A,B,C,D,E,F],[D,E,F],[D,E,F],
[A,C,E],[A,C,E],[E],[E]]

我厌倦了一些想法,但没有找到真正巧妙的解决方案,例如构建四个列表和 list.remove() 从它们生成两个空列表。 例如,my_input_list[0]*4 上的列表删除技术在我想要 [A],[A] 时给出 [A],[A],[],[](两个空列表)。

我有一个工作版本:See Pyfiddle

my_input_list = [['A'],['A','B','C'],['D'],['D','E','F'],['A','B','C','D','E','F'],['A','C','E']]
items_that_appear_twice = ['A','B','C']
items_that_appear_four = ['D','E','F']

my_output_list = []
for my_input in my_input_list:
    items_allowed_to_appear_twice = list(filter(
        lambda value: (value in items_that_appear_twice 
                       or value in items_that_appear_four),
        my_input))

    items_allowed_to_appear_four = list(filter(
        lambda value: value in items_that_appear_four,
        my_input))

    my_output_list += 2*[items_allowed_to_appear_twice]
    if len(items_allowed_to_appear_four):
        my_output_list += 2*[items_allowed_to_appear_four]

print(my_output_list)
my_input_list = [['A'],
                 ['A', 'B', 'C'],
                 ['D'],
                 ['D', 'E', 'F'],
                 ['A', 'B', 'C', 'D', 'E', 'F'],
                 ['A', 'C', 'E']]
items_that_appear_twice = ['A', 'B', 'C']
items_that_appear_four = ['D', 'E', 'F']

my_output_list = []
for sub in my_input_list:
    my_output_list.append(sub)
    my_output_list.append(sub)
    sub = [x for x in sub if x in items_that_appear_four]
    if sub:
        my_output_list.append(sub)
        my_output_list.append(sub)

assert my_output_list == [
    ['A'], ['A'],
    ['A', 'B', 'C'], ['A', 'B', 'C'],
    ['D'], ['D'], ['D'], ['D'],
    ['D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F'],
    ['A', 'B', 'C', 'D', 'E', 'F'], ['A', 'B', 'C', 'D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F'],
    ['A', 'C', 'E'], ['A', 'C', 'E'], ['E'], ['E']]

下面是我的解决方案,先对子列表进行排序,然后根据不同的情况追加到结果。

my_input_list = [['A'],['A','B','C'],['D'],['D','E','F'],['A','B','C','D','E','F'],['A','C','E']]
items_that_appear_twice = ['A','B','C']
items_that_appear_four = ['D','E','F']

result = []
for sublist in my_input_list:
    appearence = {1:[], 2:[], 4:[]}
    for item in sublist:
        appearence[2].append(item) if item in items_that_appear_twice else (appearence[4].append(item) if item in items_that_appear_four else appearence[1].append(item))
    if len(appearence[2]) > 0:
        result.append([appearence[2] + appearence[4]] * 2 + ([appearence[4]] * 2 if appearence[4] and len(appearence[4]) > 0 else []))
    else:
        result.append([appearence[4]] * 4)
for item in result:
    print(item)

输出:

[['A'], ['A']]
[['A', 'B', 'C'], ['A', 'B', 'C']]
[['D'], ['D'], ['D'], ['D']]
[['D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F']]
[['A', 'B', 'C', 'D', 'E', 'F'], ['A', 'B', 'C', 'D', 'E', 'F'], ['D', 'E', 'F'], ['D', 'E', 'F']]
[['A', 'C', 'E'], ['A', 'C', 'E'], ['E'], ['E']]
[Finished in 0.178s]