Python 通过从一个列表中选取第一个元素,从下一个列表中选取第二个到第n个元素,组合列表列表中的元素

Python 通过从一个列表中选取第一个元素,从下一个列表中选取第二个到第n个元素,组合列表列表中的元素,python,list,combinations,Python,List,Combinations,我是python新手,我正在尝试找到一种方法来执行以下操作: 我有一个包含两个列表的列表—(可以是任何数字) master=[[1,2,3,4],[5,6,7,8]] 每个项目都包含相同数量的值(在本例中,主列表中每个列表项目包含4个值) 我想得到以下输出- sublst = [[1, 2, 3, 4], #1 all elements from 1st item [1, 2, 3, 8], #2 first 3 elements from 1st item and the l

我是python新手,我正在尝试找到一种方法来执行以下操作:

我有一个包含两个列表的列表—(可以是任何数字)
master=[[1,2,3,4],[5,6,7,8]]

每个项目都包含相同数量的值(在本例中,主列表中每个列表项目包含4个值)

我想得到以下输出-

sublst = [[1, 2, 3, 4], #1 all elements from 1st item
[1, 2, 3, 8], #2 first 3 elements from 1st item and the last element from the second
[1, 2, 7, 8], #3 first 2 elements from 1st item and last two elements from the second
[1, 6, 7, 8], #4 first element from 1st item and 2 thru 4 elements from the second
[5, 6, 7, 8], #5 all elements from 2nd item
[5, 6, 7, 4], #6 first 3 elements from 2nd item and the last element from the first
[5, 6, 3, 4], #7 first 2 elements from 2nd item and last two elements from the first
[5, 2, 3, 4]] #8 first element from 2nd item and 2 thru 4 elements from the first
子列表= [[1,2,3,4],#1第一项中的所有元素
[1,2,3,8],#第1项的前3个元素和第2项的最后一个元素
[1,2,7,8],#3第一项的前两个元素和第二项的后两个元素
[1,6,7,8],#第1项中的4个元素和第2项中的2到4个元素
[5,6,7,8],#第2项中的所有元素
[5,6,7,4],#第二项的前3个元素和第一项的最后一个元素
[5,6,3,4],#7第二项的前两个元素和第一项的后两个元素
[5,2,3,4]#第二项的第一个元素和第一项的第二到第四个元素
对于主列表中的所有列表项,应重复上述内容(在本例中,主列表中只有2个列表,但可能更多)

我知道如何获取主列表中每个项目的第一个元素,但我不知道如何从第一个项目获取第一个元素,从第二个项目获取第二个元素,依此类推

我正在使用Python 3.8.3

非常感谢你的帮助

--更新日期:2020年7月9日-- 根据其中一位用户的请求,我正在添加一些示例测试用例-

  • master=[[1,2,3,4]、[5,6,7,8]、[9,10,11,12]、[13,14,15,16]。
    [1,2,3,3,3,12],[1,1,2,3,3,3,1[1,2,3,3,1,2,3,16,[1,1,2,7,7,8,[1,1,2,7,7,7,7,12[1,1,1,1,2,3,3,3,3,3,3,3[1[1,1,2,3,3,3,3,3,16[1,1,1,3,3,1,3,1,3,1,3,1,3,3,3,16,1,1,1,7,7,7,7,8 8[1,7,7,8 8 8[1,1,1,7,7,7,7,7,1,1,7,1,7,7,1,7,1,7,1,7,7,7,1,7,7,1,7,1,7,7,7,12[1,6,15,16]、[1,10,7,8]、[1,10,7,12]、[1,10,7,16]、[1,10,11,8]、[1,10,11,12]、[1,10,11,16]、[1,10,15,8],[1,10,15,12],[1,10,15,16],[1,14,7,8],[1,14,7,12],[1,14,7,16],[1,14,11,8],[1,14,11,12],[1,14,11,16],[1,14,15,12],[1,14,15,16],[5,6,7,8],[5,6,7,4],
    注:有40个组合以[1,2,3,4]为基集。如果我们以[5,6,7,8]为基,我们将有另外40个组合,依此类推。对于上述组合,总共将有40*4=160个组合。
  • 我真的不需要这些组合,只需要它们的总和。但是,我们首先需要确定每个组合,这样我们就可以得到每个组合的总和。
    最终=[10,14,18,22,18,22,26,22,26,30,26,30,34,…]

    顺序不重要,复制品可以。
    我将主数据集中的数字设置为唯一,以避免混淆。

  • master=[[0,1,2],[3,4,5],[6,7,8]。
    子列表=[[0,1,2]、[0,1,5]、[0,1,8]、[0,4,5]、[0,7,5]、[0,7,8]、[3,4,5]、[3,4,2]、[3,4,8]、[3,1,2]、[3,1,8]、[3,7,2]、[6,7,8]、[6,7,5]、[6,1,2]、[6,1,2]、[6,1,5]、[6,4,2]、[6,4,2]、[6,4,5]、[br> final=[3,6,9,9,12,12,15,12,9,15,6,12,12,18,21,15,18,9,12,12,15]
  • 将基设置为[0,1,2],我们将有7个组合,因此最终列表中的值总数为7*3=21。

    Eduardo的代码正在运行,但对于较大的列表,处理起来需要很长时间,可能是因为他的解决方案是创建包含所有可能组合的大量列表。如果我们确定每个组合并只存储总和,那么我认为他的解决方案会更快。我仍在尝试修改该解决方案。

    我最初试图用C语言中的n元树来实现它,但我认为如果我能实现排列,Python可能会有更好的方法。

    希望这有帮助!


    PS:这是我关于stackoverflow的第一篇文章,如果有任何信息丢失,我很抱歉。我已经尽力提供了尽可能多的信息。
    你可以这样做:

    def get_part_answer(l1, l2):
        n = len(l1)
        return [l1[:i] + l2[i:] for i in range(len(l1), 0, -1)]
    
    def get_answer(l):
        list1, list2 = l
        return get_part_answer(list1, list2) + get_part_answer(list2, list1)
    
    master = [[1, 2, 3, 4], [5, 6, 7, 8]]
    print(get_answer(master))
    
    其中:

    [[1, 2, 3, 4], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [5, 6, 7, 8], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4]]
    
    这里发生的事情是,您可以使用
    [:i]
    来表示第一个i元素和
    [i:]
    表示前i个元素之后的剩余元素-将每个元素连接起来,并将其放入从列表长度到1的递减循环中-这是答案的一半,然后按另一个顺序对两个列表执行相同的操作


    它不会检查列表的大小是否相同。如果列表大小不相同,则可以添加检查并引发
    ValueError

    您可以使用itertools置换来获取列表元素的所有组合(因为顺序对OP不重要,它适用于任意数量的列表):

    主机的输出=[[1,2,3,4],[5,6,7,8]

    [[1, 2, 3, 4], [5, 6, 7, 8], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4]]
    
    [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [1, 2, 3, 12], [1, 2, 11, 12], [1, 10, 11, 12], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4], [5, 6, 7, 12], [5, 6, 11, 12], [5, 10, 11, 12], [9, 10, 11, 4], [9, 10, 3, 4], [9, 2, 3, 4], [9, 10, 11, 8], [9, 10, 7, 8], [9, 6, 7, 8]]
    
    主机的输出=[[1,2,3,4],[5,6,7,8],[9,10,11,12]

    [[1, 2, 3, 4], [5, 6, 7, 8], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4]]
    
    [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [1, 2, 3, 12], [1, 2, 11, 12], [1, 10, 11, 12], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4], [5, 6, 7, 12], [5, 6, 11, 12], [5, 10, 11, 12], [9, 10, 11, 4], [9, 10, 3, 4], [9, 2, 3, 4], [9, 10, 11, 8], [9, 10, 7, 8], [9, 6, 7, 8]]
    

    这就是我想到的:

    def subpart(master):
        def subpart_(current, inListIndex, inMasterIndex, master, sublists):
            if inListIndex != 0:
                for lst in master:
                    if lst != master[inMasterIndex]:
                        current[inListIndex] = lst[inListIndex]
                        if current not in sublists: sublists.append(list(current))
                        sublists = subpart_(list(current), inListIndex-1, inMasterIndex, master, sublists)
            
            return sublists
        
        sublist = []
        for i in range(len(master)):
            mylist = list(master[i])
            sublist.append(list(mylist))
            sublist = subpart_(mylist, len(mylist)-1, i, master, sublist)
    
        return sublist
    
    它输出主列表中具有不同索引的所有元素的组合。但是不确定是否按照假装的顺序,并且它不是很有效,对此表示抱歉

    它使用递归将每个新迭代与其他列表的元素交换。 用于:

    它输出:

    [[1, 2, 3, 4], [1, 2, 3, 8], [1, 2, 7, 8], [1, 6, 7, 8], [1, 10, 7, 8], [1, 2, 11, 8], [1, 6, 11, 8], [1, 10, 11, 8], [1, 6, 3, 8], [1, 10, 3, 8], [1, 2, 3, 12], [1, 2, 7, 12], [1, 6, 7, 12], [1, 10, 7, 12], [1, 2, 11, 12], [1, 6, 11, 12], [1, 10, 11, 12], [1, 6, 3, 12], [1, 10, 3, 12], [5, 6, 7, 8], [5, 6, 7, 4], [5, 6, 3, 4], [5, 2, 3, 4], [5, 10, 3, 4], [5, 6, 11, 4], [5, 2, 11, 4], [5, 10, 11, 4], [5, 2, 7, 4], [5, 10, 7, 4], [5, 6, 7, 12], [5, 6, 3, 12], [5, 2, 3, 12], [5, 10, 3, 12], [5, 6, 11, 12], [5, 2, 11, 12], [5, 10, 11, 12], [5, 2, 7, 12], [5, 10, 7, 12], [9, 10, 11, 12], [9, 10, 11, 4], [9, 10, 3, 4], [9, 2, 3, 4], [9, 6, 3, 4], [9, 10, 7, 4], [9, 2, 7, 4], [9, 6, 7, 4], [9, 2, 11, 4], [9, 6, 11, 4], [9, 10, 11, 8], [9, 10, 3, 8], [9, 2, 3, 8], [9, 6, 3, 8], [9, 10, 7, 8], [9, 2, 7, 8], [9, 6, 7, 8], [9, 2, 11, 8], [9, 6, 11, 8]]
    

    希望我能帮上忙。

    感谢您的回复,不过,我的挑战是可能有N个列表属于大师。例如:[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]…]。当master包含两个列表时,您的代码将工作。我正在尝试使用zip获取所有组合,但无法使其工作。代码必须通过迭代器从一个列表中选择索引“x”(0到N),从其他列表中选择x+1:end。在上述情况下,我应该有[[1,2,3,4]、[1,2,3,8]、[1,2,3,12]、[1,2,3,16]、[1,2,7,8]、[1,2,11,12],[1,2,15,16]、[1,2,7,12]、[1,2,7,16]、[1,2,11,8]、[1,2,15,8]、[1,2,15,12]…]谢谢!最终列表中的列表顺序重要吗?不,顺序不重要。事实上,我只需要每个子列表中的元素之和,因为我需要[2,2,2]=8。请检查