对两列表中的分布式配对进行排序

0 投票
4 回答
1486 浏览
提问于 2025-04-16 04:31

我有两个列表,我想要得到所有可能的组合。(一个组合只能由列表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)]

撰写回答