【问题标题】:Pythonic way to iterate through list of strings?遍历字符串列表的Pythonic方式?
【发布时间】:2013-01-26 17:18:15
【问题描述】:

目前,我有以下方法可以将某种视觉文本映射中的字符放入字典中。不过,我想知道,是否有一种非常简洁的pythonic方式来进行这种双重迭代。有什么想法吗?

lines = ['abc','456','xyz']
chars = {}
for i, row in enumerate(lines):
    for j, c in enumerate(row):
        chars[i,j] = c

【问题讨论】:

  • 我认为这与等效的字典理解一样可读。
  • 你的原码没问题!
  • chars = map(list, lines) 创建一个允许更改字符串的二维列表,例如 chars[i][j] = 'c'。您也可以在此处使用bytearray 而不是list,具体取决于chars 的使用方式。

标签: python


【解决方案1】:

您可以将其表示为字典理解:

chars = {(i, j): c for i, row in enumerate(lines) for j, c in enumerate(row)}

本质上是相同的迭代,只是表达方式略有不同。

【讨论】:

  • @freestyler:这很好;一旦您习惯了推导式语法,这与原始语法一样清晰。
  • @MartijnPieters 我并不完全相信,它只是将所有内容都塞在一行中,根据几乎相同的推理,您可以提倡在一行中使用分号。
  • @phant0m:我认为这完全是个人喜好。我同意 Martijn 的观点,即人们看到的特定语法越多,它就越容易被人看到。我个人认为这两个版本具有大致相同的可读性,并且没有强烈的偏好。
  • 我同意freestyler,这不太可读。 OP的原始代码可以从左到右逐行读取。推导式语法在定义变量之前使用了变量,所以你的眼睛必须跳来跳去。
【解决方案2】:

使用字典理解。阅读嵌套推导的关键:“就像普通循环一样阅读它们,首先描述“大循环”,随后的循环嵌套在其中” @ 987654321@

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 的博客文章:"I finally understand nested comprehensions"

# 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

【讨论】:

  • 这真的和NPE的回答一样。
猜你喜欢
  • 2020-06-02
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2020-06-14
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多