2017-02-04 3 views
3

Как вы узнаете, где все элементы x находятся в n-мерном списке любой формы или размера? (Пример: [1, 2, [3, [1]] ...])Python - Поиск местоположения всех элементов x в n-мерном списке

Это код, который я придумал для нахождения первого пункта: (не сильно проверено)

def where(x, inputList): 
    return _where(x, inputList, []) 
def _where(value, inputList, dimension): 
    if isinstance(inputList, list): 
     i = 0 
     for l in inputList: 
      dimension.append(i) 
      D = _where(value, l, dimension) 
      if not D == None: 
       return D 
      i += 1 
      del dimension[-1] 
     return None 
    else: 
     if value == inputList: 
      return dimension 
     else: 
      return None 

это рекурсивно проверяет каждый элемент в списке, и, когда он находит правильный он возвращает размер или координаты этого элемента

Желаемая ввода/вывода Пример:

x = 1 
inputlist = [1, [2, 21], [1]] 
o = where_All(x, inputlist) 
# o is [[0], [2, 0]] 
print inputlist[0] # is 1 
print inputlist[2][0] # is 1 

вывода представляет собой список координат для каждый из них em в списке, который равен x

+1

Пожалуйста, укажите желаемый вход/выход в свой вопрос. Неправильный ответ на ваш код? если ваш код работает, вы можете попросить его на [codereview] (http://codereview.stackexchange.com/). – wizzup

+0

Взгляните на [этот ответ] (http://stackoverflow.com/a/41778581/4014959). Он может обрабатывать любую комбинацию вложенных списков и словарей и может находить все соответствующие элементы, а не только первый. Если вам не нужно обрабатывать словари, вы можете легко упростить код. –

+0

@wizzup Jökull хочет найти _all_ соответствующие элементы во вложенном списке. Текущий код находит только первый. –

ответ

3

Если я правильно понял, вы хотите найти координаты элемента во вложенном массиве. Затем вы можете использовать следующую функцию, которая проще и делает использование yield что особенно полезно, когда вход (haystack) является сам итератор (например, при чтении из файла или аналогичный):

def where(needle, haystack, indexes=[]): 
    for i, el in enumerate(haystack): 
     if type(el) == list: 
      for res in where(needle, el, indexes + [i]): 
       yield res 
     elif el == needle: 
      yield(indexes + [i]) 

a = [1, 2, [3, [1]]] 
for coords in where(1, a): 
    print(coords) 

Результат:

[0] 
[2, 1, 0] 
+0

«выход из», похоже, не работает в версии 2.7, который я использую в настоящее время – Glacier11

+0

Я переписал ответ на python 2 – hansaplast

+0

взгляните на ответ, он использует многие функции python, о которых вы, возможно, не знаете, например, перечисление, которое увеличивает значение 'i' для вас, поэтому вам не нужно' i + = 1' и т. д. Также 'type (el)' лучше подходит для неклассов, чем 'isinstance' – hansaplast

Смежные вопросы