有两个名单,我希望得到所有可能的夫妻。 (一对夫妇可能只是列表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]
我应该使用什么算法来获得此结果?
答案 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] ] )