从两个列表中排序分布的夫妻

时间:2010-09-23 18:18:01

标签: python algorithm sorting

有两个名单,我希望得到所有可能的夫妻。 (一对夫妇可能只是列表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 个答案:

答案 0 :(得分:3)

您应该从stdlib中查看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)]

由于product()返回一个迭代器,你不需要将它强制转换为list()(并且你可能不应该使用大型列表。)我刚才补充一点,为了说明这个例子应该决定自己测试并想要打印值。

答案 1 :(得分:3)

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 :(得分:0)

按照您想要的方式进行操作,您可以翻转值:

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

答案 3 :(得分:0)

在伪代码中(不太确定python的语法):

给出大小为n的list_1和大小为m的list_2:

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