Сортировать распределенные пары из двух списков - PullRequest
0 голосов
/ 23 сентября 2010

Имея два списка, я хочу получить все возможные пары.(пара может быть только одним элементом из списка 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 ]

3 голосов
/ 23 сентября 2010
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)]

3 голосов
/ 23 сентября 2010

Вы должны извлечь itertools.product() из stdlib.

Редактировать: я имел в виду 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() (а с большими списками вы, вероятно, не должны.) Я просто добавил, что для иллюстрации в этом примере следует решить проверить его самостоятельно и напечататьценности.

0 голосов
/ 23 сентября 2010

В псевдокоде (не совсем уверен в синтаксисе Python):

заданный список_1 размера n и список_2 размера m:

couples = []
for i=0 to n-1
   for j=0 to m-1
      couples.append( [ list_1[i], list_2[ (i+j) % m] ] )
0 голосов
/ 23 сентября 2010

Чтобы сделать так, как вы хотите, и вы можете перевернуть значения:

>>> 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...