对两列表中的分布式配对进行排序
我有两个列表,我想要得到所有可能的组合。(一个组合只能由列表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
要按照你想要的方式操作,你可以交换这些值:
>>> 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
你可以看看标准库里的 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()
(而且如果列表很大,你可能也不应该这样做)。我加这个只是为了说明,如果你决定自己测试一下并想打印出值的话。
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)]