【问题标题】:Python List Comprehension for a list with lists带有列表的列表的 Python 列表理解
【发布时间】:2016-05-19 23:58:39
【问题描述】:

我正在文件中进行字符串替换,并使用csv 编写器在输出中写入制表符。使用 csv 编写器意味着我需要一个格式正确的列表来提供给 csv 编写器进行输出。我采用一行输入来指定制表符和换行符,并将其放入 csv 编写器知道如何写出的列表中。

我有下面的代码,它实际上完成了所需的任务,我想知道的是,是否可以使用 for 循环上的列表理解进一步细化该代码,以将选项卡分解为它们自己的列表并替换现有项目列表。代码如下:

testInput = "\\t//blah/...\\t//blah_blah/...\\n\\t-//blah/...\\t//blah/...\\n\\t//blah/...\\t//blah_blah/...\\n\\t//blah/...\\t//blah/...\\n"

new_lines = [z for z in testInput.split('\\n') if z]

x=-1
if testInput.find("\\t") >= 0:
    for line in new_lines:
        x+=1
        lines = line.split("\\t")
        new_lines[x] = lines
replacement_value = new_lines

使用此代码,for 循环将 new_lines 转换为:

到这里:

可以使用列表理解重写 for 循环吗?

【问题讨论】:

  • 你真的应该把这个发到codereview.stackexchange.com
  • 我很困惑。你说的这个“csv writer”是什么?我在您的代码中没有看到任何内容。
  • 您是否有某种原因需要列表理解?在您的情况下,您拥有的 for 循环将产生更好的性能:您的迭代。
  • @Daniel:会吗?通常,列表推导会击败等效的 for 循环(并非总是如此,但经常如此)。 for 循环可以使用 enumerate 而不是手动调整的索引值 (for x, line in enumerate(new_lines):) 加速,但如果它从一开始就创建正确的 list 而不是创建一个list 行,然后将所有条目转换为 lists 字段。
  • @ShadowRanger 是的;在这里创建正确的list 最初会为性能创造奇迹。我试图强调一个事实,即列表组合在所有情况下都不是性能的灵丹妙药。我想如果他们真的想获得技术,OP 可以timeit 每种方法:)

标签: python list csv list-comprehension


【解决方案1】:

我认为您可以在这样的列表组合中使用列表组合来做到这一点......

[[s for s in z.split("\\t")] for z in testInput.split('\\n') if z]

既然很好奇,看来你可以这样回去……

"\\n".join(["\\t".join([a for a in x]) for x in new_lines])+"\\n"

【讨论】:

  • 或者只是为了好玩,mapfilter 方法将工作推到 CPython 中的 C 级别:from operator import methodcaller, map(methodcaller('split', '\\t'), filter(None, testInput.split('\\n')));如果在 Py3 上并且您需要 lists 的 list,而不是 lists 的生成器,请将 map 调用包装在 list 中。 :-)
  • clutton 的回答正是 for 循环所做的,所以答案是正确的。我对你如何调试这个有点困惑?使用 for 循环,我可以单步执行代码并查看所做的更改。使用列表理解方法,我可以在行和步骤上设置断点,但在这种情况下,您可以观察的唯一变量是 s。这是列表理解的常见问题还是我做错了?
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 2020-05-29
  • 2013-05-10
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多