【问题标题】:Finding all possible complete pairings from a list in Google Sheets从 Google 表格中的列表中查找所有可能的完整配对
【发布时间】:2019-06-13 23:49:36
【问题描述】:

我有一个名称列表,我想生成所有可能的组合,其中列表中的每个人都使用 Google 表格以非重复方式唯一配对。名称列表是可变的,有时可能是奇数。 因此,例如,如果我有四个人,列表将如下所示,只有数字会替换为实际姓名。

(1,2)(3,4)

(1,3)(2,4)

(1,4)(2,3)

获得完整的组合列表后,我可以自己对其进行排序,找出以前最少使用的组合。

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-formula array-formulas google-sheets-query


    【解决方案1】:

    试试 python itertools。 https://docs.python.org/2/library/itertools.html

    import itertools
    nameList = ['john', 'joe', 'jimmy', 'jack']
    
    for name1, name2 in itertools.combinations( nameList, 2 ):
      print( '({}, {})'.format( name1, name2 ))
    

    如果你想要 (name1, name2) 和 (name2, name1) 尝试 itertools.permuations

    【讨论】:

      【解决方案2】:
      =QUERY(ARRAYFORMULA(UNIQUE(
       TRANSPOSE(SPLIT(REPT(CONCATENATE(A1:A4&CHAR(9)), COUNTA(A1:A4)), CHAR(9)))&" "&
       TRANSPOSE(SPLIT(CONCATENATE(REPT(A1:A4&CHAR(9), COUNTA(A1:A4))), CHAR(9))))),
       "select Col1 where Col1 is not null", 0)
      


      =TRANSPOSE(QUERY(TRANSPOSE(QUERY(ARRAYFORMULA(UNIQUE(
       TRANSPOSE(SPLIT(REPT(CONCATENATE(A1:A4&CHAR(9)), COUNTA(A1:A4)), CHAR(9)))&" "&
       TRANSPOSE(SPLIT(CONCATENATE(REPT(A1:A4&CHAR(9), COUNTA(A1:A4))), CHAR(9))))),
       "select Col1 where Col1 is not null", 0)), 
       "select Col2,Col3,Col4,Col7,Col8,Col12", 0))
      

      【讨论】:

        【解决方案3】:

        感谢大家的帮助。我认为我的查询缺乏详细信息。我希望得到一个表格结果,其中每一行都是每个人/字符串单独与另一个字符串配对的彻底结果。 我不擅长编码,所以我受到启发在 python 中使用递归函数和一点数学魔法来完成它。我能够让它接受一个变量列表并相应地扩展。

        nameList = ['1', '2', '3', '4', '5']
        if(len(nameList) % 2 == 1):
            nameList.append(" ")
        print(nameList)
        length = len(nameList)
        possible = 1
        
        while length > 1:
            possible = possible*(length-1)
            length -= 2
        def completeCombinations (List, line):
            BaseList = list(List)
            if (line % (len(List)-1) == 0):
                num = (len(List)-1)
            else:
                num = line % (len(List)-1)
            BaseList.remove(List[0])
            BaseList.remove(List[num])
            if(len(List) > 2):
                CurrentList = list(completeCombinations(BaseList, line))
                CurrentList.insert(0, List[num])
                CurrentList.insert(0, List[0])
            else:
                CurrentList = list(List)
            return CurrentList
        
        i = 1
        while i < possible:
            print completeCombinations(nameList, i+1)
            i += 1
        

        结果看起来非常接近我的预期,如果不一定漂亮的话。

        ['1', '2', '3', '4', '5', ' ']
        ['1', '3', '2', '5', '4', ' ']
        ['1', '4', '2', ' ', '3', '5']
        ['1', '5', '2', '3', '4', ' ']
        ['1', ' ', '2', '4', '3', '5']
        ['1', '2', '3', ' ', '4', '5']
        ['1', '3', '2', '4', '5', ' ']
        ['1', '4', '2', '5', '3', ' ']
        ['1', '5', '2', ' ', '3', '4']
        ['1', ' ', '2', '3', '4', '5']
        ['1', '2', '3', '5', '4', ' ']
        ['1', '3', '2', ' ', '4', '5']
        ['1', '4', '2', '3', '5', ' ']
        ['1', '5', '2', '4', '3', ' ']
        ['1', ' ', '2', '5', '3', '4']
        

        衷心感谢任何可以帮助我完善它并将结果导入谷歌表格的人

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-25
          • 2018-04-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多