Как эффективно сделать нумерованный список в Python Class-list - PullRequest
0 голосов
/ 09 октября 2018

Как сделать следующий код более компактным и эффективным.

Здесь код должен был найти позицию, в которой определенное числовое значение находится в списке.Например, данный набор чисел

ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]]

Значения 100, 50 и 500 были в позициях 0,3 и 9 соответственно.

Код тестирования был следующим

ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]]
NumberedList = ListNo
Const = 0
items = 0

for i, item in enumerate(ListNo):
    MaxRange = len(item) if isinstance(item, list) else 1

    for x in range(0, MaxRange):
        if MaxRange > 1:
            NumberedList[i][x] = Const
        else:
            NumberedList[i] = Const
        Const = Const + 1

print(NumberedList)

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

У меня вопрос, есть ли другой способ сделать этот код более компактным и эффективным.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Рекурсивное решение было бы более элегантным и обрабатывало бы больше случаев:

def nested_list_ordinal_recurse(l, it):
    if isinstance(l, list):
        return [nested_list_ordinal_recurse(item, it) for item in l]
    else:
        return next(it)

def nested_list_ordinal(l, _it=None):
    return nested_list_ordinal_recurse(l, itertools.count())
0 голосов
/ 09 октября 2018
ListNo = [[100,2,5], [50,10], 4, 1, [6,6,500]];
count=-1
def counter(l=[]):
     global count
     if l:
      return [counter() for i in l]
     else:
         count+=1
         return count
print [counter(item) if isinstance(item, list) else counter()  for item in ListNo ]

Без инструментов iter

0 голосов
/ 09 октября 2018

Вы можете использовать itertools.count:

from itertools import count
i = count()
print([[next(i) for _ in range(len(l))] if isinstance(l, list) else next(i) for l in ListNo])

Это выводит:

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