Как заставить эту функцию возвращать пару комбинаций из строк массива в Python? - PullRequest
0 голосов
/ 27 ноября 2018

у меня есть следующая функция

import numpy as np

a = [['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l']]
b = np.array(a)

def func01(matrix):
    m,n = np.shape(matrix)
    for jump in range (m-1):
        for row in range (jump):
            for col in range (n):
                print (matrix[row][col],matrix[row+jump][col])

func01(b)

это приводит к:

('a', 'd') ('b', 'e') ('c',«f») («a», «g») («b», «h») («c», «i») («d», «j») («e», «k») ('f', 'l')

однако я хочу, чтобы мой результат выглядел так:

('a', 'd') ('b', 'e') ('c ',' f ') (' a ',' g ') (' b ',' h ') (' c ',' i ') (' a ',' j ') (' b ',' k') (' c ',' l ') (' d ',' g ') (' e ',' h ') (' f ',' i ') (' d ',' j ') (' e',' k ') (' f ',' l ') (' g ',' j ') (' h ',' k ') (' i ',' l ')

Что естьЯ сделал неправильно?Извините за мой плохой английский

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Использование комбинаций из itertools и некоторых кусков:(«a», «j»), («b», «e»), («b», «h»), («b», «k»), («c», «f»),('c', 'i'), ('c', 'l'), ('d', 'g'), ('d', 'j'), ('e', 'h'),('e', 'k'), ('f', 'i'), ('f', 'l'), ('g', 'j'), ('h', 'k'),('i', 'l')]

0 голосов
/ 27 ноября 2018

Это именно тот случай, когда zip был создан для:

from itertools import combinations

a = [['a','b','c'], ['d','e','f'], ['g','h','i'], ['j','k','l']]

result = [list(zip(*x)) for x in combinations(a, 2)]

# If you want to flatten the result:
flat_result = [item for row in result for item in row]

print(flat_result)

результат:

[[('a', 'd'), ('b', 'e'), ('c', 'f')],
 [('a', 'g'), ('b', 'h'), ('c', 'i')],
 [('a', 'j'), ('b', 'k'), ('c', 'l')],
 [('d', 'g'), ('e', 'h'), ('f', 'i')],
 [('d', 'j'), ('e', 'k'), ('f', 'l')],
 [('g', 'j'), ('h', 'k'), ('i', 'l')]]

flat_result:

[('a', 'd'), ('b', 'e'), ('c', 'f'), ('a', 'g'), ('b', 'h'), ('c', 'i'), ('a', 'j'), ('b', 'k'), ('c', 'l'), ('d', 'g'), ('e', 'h'), ('f', 'i'), ('d', 'j'), ('e', 'k'), ('f', 'l'), ('g', 'j'), ('h', 'k'), ('i', 'l')]

Или, если вы хотите напрямую вычислить плоскую версию:

result = []
for x in combinations(a, 2):
    result += list(zip(*x))
0 голосов
/ 27 ноября 2018

Как насчет этого:

a = [['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l']]

new_list = []   
for i in range(len(a)): # Loop over the first subgroup
    for j in range(i+1, len(a)): # Loop over the second subgroup
        for k in range(len(a[0])): # Loop through the elements of each subgroup
            new_list.append((a[i][k], a[j][k]))


new_list
[('a', 'd'), ('b', 'e'), ('c', 'f'),
 ('a', 'g'), ('b', 'h'), ('c', 'i'),
 ('a', 'j'), ('b', 'k'), ('c', 'l'),
 ('d', 'g'), ('e', 'h'), ('f', 'i'),
 ('d', 'j'), ('e', 'k'), ('f', 'l'),
 ('g', 'j'), ('h', 'k'), ('i', 'l')]

Это может быть более кратким со списком:

new_list = [(a[i][k], a[j][k]) for i in range(len(a)) 
            for j in range(i+1, len(a)) 
            for k in range(len(a[0])]
...