给出一个列表列表,其中列表的数量和内部元素的数量是可变的。例如:
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]]
访问原始列表。欢迎更好的想法。
答案 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)