Python 具有可变成员的列表列表的乘积

Python 具有可变成员的列表列表的乘积,python,list,membership,Python,List,Membership,假设我有这个输入数据 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

假设我有这个输入数据

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()
,从中生成两个空列表。 例如,
我的输入列表[0]*4
上的列表删除技术提供了
[A]、[A]、[]
(两个空列表),当我需要
[A]、[A]
时,我有一个工作版本:

我有一个工作版本:


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

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]

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

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]

也许只是我,但我真的搞不懂你从输入到输出的映射。最后两个元素
[E],[E]
来自哪里?关于
[D,E,F],[D,E,F],[D,E,F],[A,B,C,D,E,F],[A,B,C,D,D,E,F]之后的元素,我想我理解了。。。它们是允许重复四次的元素。看答案:)是的,最后两个是棘手的。你得到了四个出现的项目,但只有两个出现了两次。也许只是我,但我真的无法理解你从输入到输出的映射。最后两个元素
[E],[E]
来自哪里?关于
[D,E,F],[D,E,F],[D,E,F],[A,B,C,D,E,F],[A,B,C,D,D,E,F]之后的元素,我想我理解了。。。它们是允许重复四次的元素。看答案:)是的,最后两个是棘手的。您得到了四个出现的项目,但只有两个出现两次。小的改进,您可以替换两个
my\u output\u列表。在这两种情况下,仅用一个
my\u output\u list+=2*[sub]
追加(sub)
@raul.vila,如果OP更改了数字,那么它会更聪明、更短、更灵活,但现在我更喜欢我的版本,因为它的作用显而易见,而我必须思考一下才能理解你的代码。当然,不需要更改代码。有了你的版本和我的评论,任何人都可以选择:)。小小的改进,你可以用一个
my_output_list+=2*[sub]
来替换两个
my_output_list@raul.vila,如果OP更改了数字,那么它会更聪明、更短、更灵活,但现在我更喜欢我的版本,因为它的作用显而易见,而我必须思考一下才能理解你的代码。当然,不需要更改代码。根据您的版本和我的评论,任何人都可以选择:)。标记为答案,但感谢所有人的良好选择。很难选择一个。标记为答案,但感谢大家所有的好选择。很难选一个。