【问题标题】:List comprehension with if-condition带有 if 条件的列表理解
【发布时间】:2012-09-29 14:41:37
【问题描述】:

下面一行 Python 代码

values = ", ".join(["\"%s\"" % x for x in row])

获取“row”中的元素列表以创建逗号分隔的字符串“values”,同时将每个值放在双引号中,例如: “纽约”、“5”、“”、“3.2”

但是,由于结果是 mysqldump 文件的一部分,因此空字段 ("") 应变为 NULL(不带双引号)。

因此,我想学习如何更改该表达式,以便检查 x 是否为空 (""),在这种情况下,应将 NULL 附加到值字符串。

谢谢

【问题讨论】:

  • 仅供参考:您不需要使用 [] 和列表理解。如果你把它们排除在外,那么剩下的是generator expression

标签: python optimization coding-style


【解决方案1】:
values = ", ".join('"%s"' % x if x else 'NULL' for x in row)

例如:

>>> row = ["foo", "", "bar"]
>>> values = ", ".join('"%s"' % x if x else 'NULL' for x in row)
>>> values
'"foo", NULL, "bar"'

感谢 DSM 指出,将列表推导式更改为 generator expression 当然会更好——这样会更快,因为不再需要构造一个随后会立即丢弃的列表。

【讨论】:

  • 简短而甜蜜的解决方案,非常感谢!除了提供解决方案外,它还教我如何在 Python 中嵌套代码以及如何处理优先级。丹克!
  • 请注意,对于x 的任何假值,这将输出NULL,而不仅仅是空字符串""00.0[]{} 将所有结果都是NULL
  • 我发现这里的 genexp 实际上慢了一点,但是对于非常小的例子来说通常是这种情况。最终,genexp 将获胜。
  • 我已经使用csv 发布了一个答案,这有点令人费解,但我想这将与values = ', '.join('"%s"' % str(x).replace('"', '""') ... 一起处理嵌入的引号
【解决方案2】:
values = ", ".join(["NULL" if x == "" else "\"%s\"" % x for x in row])

【讨论】:

  • 这个解决方案也有效,但不如 Tim 的优雅。
  • 他们做不同的事情。 Tim 的 if x 也会为 x == 0 打印 NULL,这可能不是 Steve06 的意图。
  • 您的评论是正确的,只需测试并确认即可。这使您的解决方案成为赢家。
【解决方案3】:

为了使它更健壮一点,我会利用 csv 模块来处理嵌入的字段和字符串分隔符...(只是一个临时示例)

from StringIO import StringIO
import csv

csvrec = StringIO()
csvout = csv.writer(csvrec, quoting=csv.QUOTE_ALL)
items = [1, 'hello, there, how are you?', 3.2, 'it\'s a "cat" I say!', '', '']
csvout.writerow([col or '\t' for col in items]) # maybe col != '' ?
print csvrec.getvalue().replace('"\t"', 'NULL').strip()
# "1","hello, there, how are you?","3.2","it's a ""cat"" I say!",NULL,NULL

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-11-25
    • 2023-03-29
    • 2017-03-20
    • 2012-05-03
    相关资源
    最近更新 更多