如何将索引的平面列表放入列表列表中?

时间:2015-06-17 00:15:59

标签: python python-3.x

给出一个列表列表,其中列表的数量和内部元素的数量是可变的。例如:

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)]

这不能用列表理解来完成吗?我只是遇到了一些麻烦,我相信那里有一个大锤子的brainiac。

最终目标是随机访问每个节点一次,并且只访问一次,并且在访问期间,确切地知道当前节点在宏观方案中的位置。所以我将结果random.shuffle(nodes)混乱并循环遍历它 - 使用元组通过branches[node[0]][node[1]]访问原始列表。欢迎更好的想法。

3 个答案:

答案 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)]

答案 1 :(得分:1)

enumerate功能可让您轻松访问每个元素的索引和值。

NET "/>"

答案 2 :(得分: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)