代码之家  ›  专栏  ›  技术社区  ›  Joylove

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

  •  1
  • Joylove  · 技术社区  · 8 年前

    假设我有这个输入数据

    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] 。

    3 回复  |  直到 8 年前
        1
  •  2
  •   raul.vila    8 年前

    我有一个工作版本: 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)
    
        2
  •  1
  •   Alex Hall    8 年前
    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']]
    
        3
  •  1
  •   Sphinx    8 年前

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

    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]
    
    推荐文章