2015-06-17 4 views
0

Учитывая список списков, в которых количество списков и количество элементов внутри переменной. Например:Как получить плоский список индексов в список списков?

import random 
import string 

bar = lambda: [random.choice(string.ascii_letters) for _ in range(random.randint(1,5))] 
branches = [bar() for _ in range(4)] 

>>> branches 
[['t'], ['S', 't'], ['Q'], ['M', 'a', 'J', 'x', 'Y']] 

мне интересно, если есть более емкий способ создать список кортежей, которые индекс списка. Что-то более кратким, чем это:

nodes = [] 
for branch in range(len(branches)): 
    for node in range(len(branches[branch])): 
     nodes.append((branch, node)) 

>>> nodes 
[(0, 0), (1, 0), (1, 1), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4)] 

Не удалось ли это сделать со списком? У меня просто есть проблемы с гвоздями, и я уверен, что там есть бриниак с большим молотом.

Конечной целью является случайное посещение каждого узла один раз и только один раз и во время посещения, чтобы точно знать, где находится текущий узел в великой схеме вещей. Поэтому я перетасовываю результат random.shuffle(nodes) и перебираю его, используя кортеж, чтобы получить доступ к исходному списку через branches[node[0]][node[1]]. Лучшие идеи приветствуются.

+2

Вложенный цикл может быть записан как понимание списка: '[(b ранчо, узел) для ветви в диапазоне (len (ветви)) для узла в диапазоне (len (branch [branch]))]. –

ответ

1

Функция enumerate позволяет вам легко получить доступ к индексу и значению каждого элемента.

>>> branches = [['t'], ['S', 't'], ['Q'], ['M', 'a', 'J', 'x', 'Y']] 
>>> [(idx, id) for idx,val in enumerate(branches) for id,v in enumerate(val)] 
[(0, 0), (1, 0), (1, 1), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4)] 
0

Если цель состоит в том, чтобы перебирать каждый элемент случайно:

import random 
l = [['t'], ['S', 't'], ['Q'], ['M', 'a', 'J', 'x', 'Y']] 

l2 = [x for y in l for x in y] 
random.shuffle(l2) 
+0

перебираем их случайным образом *, но * с указанием текущего узла –

2

Перечень действительно не требуется:

In [1]: branches = [['t'], ['S', 't'], ['Q'], ['M', 'a', 'J', 'x', 'Y']] 
      [(i, j) for i in range(len(branches)) for j in range(len(branches[i]))] 
Out[1]: [(0, 0), (1, 0), (1, 1), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4)] 

или, по крайней мере, не так:

In [2]: branches = [['t'], ['S', 't'], ['Q'], ['M', 'a', 'J', 'x', 'Y']] 
      [(i, j) for i,branch in enumerate(branches) for j in range(len(branch))] 
Out[2]: [(0, 0), (1, 0), (1, 1), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4)] 
Смежные вопросы