【问题标题】:Nested generator or iterator for pythonpython的嵌套生成器或迭代器
【发布时间】:2018-06-04 08:26:28
【问题描述】:

我有下一个清单:

texts = [['abcdD', 'asdfaD'], ['qerqD', 'asdfafdasD']]

我想从所有字符串的右侧删除所有字符D

对于一个列表,我可以轻松完成:

res1 = [el.strip('D') for el in texts[0]] # ['abcd', 'asdfa']

现在我对每个文本都尝试相同的方法:

res2 = [el.strip('D') for text in texts for el in text]

但它返回一个列表(结合我的两个!):

['abcd', 'asdfa', 'qerq', 'asdfafdas']

下次需要时:

[['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

如何正确处理?

【问题讨论】:

  • 差不多,换个顺序就行了。 [[el.strip('D') for el in text] for text in texts]
  • 您需要嵌套 list-comprehensions。
  • @COLDSPEED rstrip('D') 会更精确。
  • 确实如此,根据 Op 对问题的描述。
  • @cᴏʟᴅsᴘᴇᴇᴅ 你又来了! :D 几天前你帮助了我!你的评论完美!如果您发布答案,我会接受。谢谢。

标签: python string text generator iterable


【解决方案1】:

您可以将这种递归方法用于任意深度嵌套的结构:

def f(s):
  return [q.strip('D') if isinstance(q, basestring) else f(q)
          for q in s]

(在 Python3 中使用 str 而不是 basestring。)

例子:

f([['abcdD', 'asdfaD'], ['qerqD', 'asdfafdasD']])

返回:

[['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

【讨论】:

  • 这很好,但 basestring 是 python2 的东西。您可以添加一个 py3 版本。
  • 对。两者兼得:q.strip('D') if 'strip' in dir(q) else f(q).
  • 是的,我使用 python3
  • 等待except 运算符 ;-) return [q.strip('D') except f(q)] 如果你理解我的意思 ;-)
  • @Alfe 虽然我也在等待,但在这里无济于事。 str.strip 在找不到要剥离的字符时不会引发异常。
【解决方案2】:

你可以试试这个:

texts = [['abcdD', 'asdfaD'], ['qerqD', 'asdfafdasD']]
new_texts = [[b[:-1] if b.endswith('D') else b for b in i] for i in texts]

输出:

[['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

【讨论】:

  • 如果字符串末尾不存在D怎么办?
  • 最好是b.strip('D')
  • @cᴏʟᴅsᴘᴇᴇᴅ 添加了检查条件。
【解决方案3】:

'maphappy' 方法怎么样 - 只是为了好玩,而不是我能看到的任何优势

list(map(list, map(lambda txt: map(lambda x: x.rstrip('D'), txt), texts)))

Out[240]: [['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

【讨论】:

  • 不要认为这是最快的方式,而是最有趣的!谢谢!
【解决方案4】:

正如我在评论中提到的,您需要嵌套其中一个循环。

x = [['abcdD', 'asdfaD'], ['qerqD', 'asdfafdasD']]
y = [[j.rstrip('D') for j in i] for i in x]

y
[['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

如果将上面的内容转换为嵌套循环,这很容易理解 -

y = []
for i in x:
    y.append([])
    for j in i:
        y[-1].append(j.rstrip('D'))

y
[['abcd', 'asdfa'], ['qerq', 'asdfafdas']]

您决定使用什么实际上是风格问题。列表理解很简洁,但存在可读性问题。循环通常非常快速且可读。

【讨论】:

  • 嗨,COLDSPEED。我使用了您的答案,而 Alfe 的答案看起来更安全。你怎么看待这件事?不知道该接受什么:)
  • @Mikhail_Sam 嗯,Alfe 的答案是针对 python2,而这适用于任何版本。其次,如果您的数据只是列表列表(而不是任意嵌套列表),那么这比 Alfe 更能解决您的问题。由你决定。正如你所看到的,有人很可爱地对我的回答投了反对票,所以不是每个人都会同意我的看法。
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2011-09-19
  • 2018-11-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多