目前,我有以下方法将字符放在一种可视文本映射中的字典中。不过,我想知道,是否有一种非常简洁的pythonic方式来进行这种双重迭代。有任何想法吗?
lines = ['abc','456','xyz']
chars = {}
for i, row in enumerate(lines):
for j, c in enumerate(row):
chars[i,j] = c
目前,我有以下方法将字符放在一种可视文本映射中的字典中。不过,我想知道,是否有一种非常简洁的pythonic方式来进行这种双重迭代。有任何想法吗?
lines = ['abc','456','xyz']
chars = {}
for i, row in enumerate(lines):
for j, c in enumerate(row):
chars[i,j] = c
您可以将其表示为字典理解:
chars = {(i, j): c for i, row in enumerate(lines) for j, c in enumerate(row)}
它基本上是相同的迭代,只是表达方式略有不同。
使用 dict 理解。阅读嵌套推导的关键: “就像普通循环一样阅读它们,首先描述“大循环”,随后的循环嵌套在其中” 1
In [1]: lines = ['abc','456','xyz']
In [2]: {(i,j): c for i, row in enumerate(lines) for j, c in enumerate(row)}
Out[2]:
{(0, 0): 'a',
(0, 1): 'b',
(0, 2): 'c',
(1, 0): '4',
(1, 1): '5',
(1, 2): '6',
(2, 0): 'x',
(2, 1): 'y',
(2, 2): 'z'}
您可以将理解拆分为多行,以使其更具可读性。如果仔细观察,它实际上与常规循环非常相似,只有最后一行被带到了开头。
除此之外,我建议阅读 Brandon Rhodes 的一篇博文:“我终于理解了嵌套推导”
# Comprehension # Regular for loop
{(i,j):c # chars = {}
for i, row in enumerate(lines) # for i, row in enumerate(lines):
for j, c in enumerate(row)} # for j, c in enumerate(row):
# chars[i,j] = c