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

从两个列表中对分布的夫妇进行排序

  •  0
  • juanefren  · 技术社区  · 15 年前

    有两张单子,我想找到所有可能的情侣。(一对只能是列表1中的一个元素和列表2中的另一个元素)

    如果我执行双“foreach”语句,我会立即得到它(我使用的是python):

    couples = []
    for e1 in list_1:
        for e2 in list_2:
            couples.append([l1, l2])
    

    例如:

    list_1 = [a,b,c]
    list_2 = [1,2]
    

    我会得到:

    [a, 1]
    [a, 2]
    [b, 1]
    [b, 2]
    [c, 1]
    [c, 2]
    

    并期望被分类如下:

    [a, 1]
    [b, 2]
    [c, 1]
    [a, 2]
    [b, 1]
    [c, 2]
    

    4 回复  |  直到 15 年前
        1
  •  3
  •   eumiro    15 年前
    from itertools import islice, izip, cycle
    
    list_1 = ['a','b','c']
    list_2 = [1,2]
    
    list(islice(izip(cycle(list_1), cycle(list_2)), len(list_1)*len(list_2)))
    

    退换商品 [('a', 1), ('b', 2), ('c', 1), ('a', 2), ('b', 1), ('c', 2)]

        2
  •  3
  •   jathanism    15 年前

    你应该退房 itertools.product()

    编辑:我是说 product() permutations()

    import itertools
    
    list_1 = ['a','b','c']
    list_2 = [1,2]
    
    # To pair list_1 with list_2 
    paired = list(itertools.product(list_1, list_2))
    # => [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)]
    
    # To get the sorting you desired:
    wanted = sorted(paired, key=lambda x: x[1])
    # [('a', 1), ('b', 1), ('c', 1), ('a', 2), ('b', 2), ('c', 2)]
    

    产品() 返回一个迭代器,您不需要将其强制转换为 list() (对于较大的列表,您可能不应该这样做。)我刚刚添加了一个示例,为了便于演示,您应该决定自己测试它并打印值。

        3
  •  0
  •   pyfunc    15 年前

    以您想要的方式执行,您可以翻转值:

    >>> z = [[k, l] for l in x for k in y]
    >>> z
    [[1, 'a'], [2, 'a'], [3, 'a'], [1, 'b'], [2, 'b'], [3, 'b'], [1, 'c'], [2, 'c'], [3, 'c']]
    >>> z.sort()
    >>> z
    [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]
    >>> T = [[x[1], x[0]] for x in z]
    >>> T
    [['a', 1], ['b', 1], ['c', 1], ['a', 2], ['b', 2], ['c', 2], ['a', 3], ['b', 3], ['c', 3]]
    
        4
  •  0
  •   Ssancho    15 年前

    在伪代码中(不太清楚python的语法):

    给定大小为n的列表\u 1和大小为m的列表\u 2:

    couples = []
    for i=0 to n-1
       for j=0 to m-1
          couples.append( [ list_1[i], list_2[ (i+j) % m] ] )