Как объединить несколько массивов в парах

У меня проблема с «спариванием» массивов в один (по индексу). Вот пример:

ВХОД:

inputArray = [[0, 1, 2, 3, 4], [2, 3, 5, 7, 8], [9, 6, 1]] 

ОЖИДАЕМЫЙ ВЫХОД:

 outputArray = [[0,2,9], [1,3,6], [2,5,1], [3,7,chooseRandom()], [4,8,chooseRandom()]] 

Вопросов:

  1. Как избежать проблемы с ошибкой «вне диапазона» «ошибка индекса»
  2. Как написать selectRandom (), чтобы выбрать N соседнего

ответы:

  1. [SOLVED] Решения, предоставляемые @jonrsharpe & @Christian & @Decency, работают так, как ожидалось

Разъяснение:

Под соседом я имею в виду: введите описание изображения здесь

Я использую python, но вы можете делиться своими мыслями на любом языке.

Я думаю, что следующее будет делать то, что вы хотите:

 from itertools import izip_longest # 'zip_longest' in Python 3.x from random import choice # Step 1 outputArray = list(map(list, izip_longest(*inputArray))) # Step 2 for index, arr in enumerate(outputArray): if any(item is None for item in arr): valid = [item for item in arr if item is not None] outputArray[index] = [choice(valid) if item is None else item for item in arr] 

Это два шага:

  1. Объедините все под-списки inputArray с длиной самой длинной inputArray , заполняя None : [[0, 2, 9], [1, 3, 6], [2, 5, 1], [3, 7, None], [4, 8, None]] ; а также
  2. Работайте через outputArray , outputArray любые под-списки, которые содержат None и заменяя None на случайный выбор из других элементов в под-списке, которые не являются None .

Пример вывода:

 [[0, 2, 9], [1, 3, 6], [2, 5, 1], [3, 7, 3], [4, 8, 8]] 

Вот мой подход к проблеме, в Python 3.4. Я действительно не знаю, что вы подразумеваете под «выбрать N соседей», но должно быть довольно легко написать, что вы хотели бы в контексте ниже.

 inputArray = [[0, 1, 2, 3, 4], [2, 3, 5, 7, 8], [9, 6, 1]] import itertools zipped = itertools.zip_longest(*inputArray, fillvalue=None) outputArray = [list(item) for item in zipped] # [[0, 2, 9], [1, 3, 6], [2, 5, 1], [3, 7, None], [4, 8, None]] # Now replace the sentinel None in our sublists for sublist in outputArray: for i, element in enumerate(sublist): if element is None: sublist[i] = chooseRandom() print(outputArray) 

Не самый пифонический способ, но вы можете попробовать использовать этот код, перефразировать, прочитать комментарии в коде ниже:

 import itertools, random inputArray = [ [0, 1, 2, 3, 4], [2, 3, 5, 7, 8], [9, 6, 1] ] outputArray = [] max_length = max(len(e) for e in inputArray) # maximum length of the sublists in <inputArray> i = 0 # to keep the index of sublists of <outputArray> for j in range(max_length): outputArray.append([]) # add new sublist for e in inputArray: # iterate through each element of <inputArray> try: outputArray[i].append(e[j]) # try to append the number, if an exception is raised # then the code in the <except> clause will be executed except IndexError as e: outputArray[i].append(random.randint(0, 10)) # add the random number i += 1 # increase the sublists index on each iteration print outputArray # [[0, 2, 9], [1, 3, 6], [2, 5, 1], [3, 7, 3], [4, 8, 7]] 

Заметка:

Вы можете изменить часть

 random.randint(0, 10) 

чтобы получить «N сосед» .

Дайте мне знать, нравится ли вам этот код:

 import random array = [[0, 1, 2, 3, 4], [2, 3, 5, 7, 8], [9, 6, 1]] max_len = max([len(l) for l in array]) dictionary = {} for l in array: for i in range(0,len(l)): if dictionary.has_key(i): dictionary[i].append(l[i]) else: dictionary[i] = [l[i]] for i in range(len(l),max_len): if dictionary.has_key(i): dictionary[i].append(random.choice(l)) else: dictionary[i] = [random.choice(l)] print dictionary.values()