1

我将如何更简洁地编写以下内容?

    genres = ','.join([item for item in list((sheet.cell(n,18).value, 
                      sheet.cell(n,19).value, sheet.cell(n,20).value)) if item])
4

2 回答 2

6
','.join(filter(None, (sheet.cell(n, i).value for i in (18, 19, 20))))

(sheet.cell(n, i).value for i in (18, 19, 20))是替换部分的生成器表达式list(…)。您可以将元组替换(18, 19, 20)为范围或其他内容。

filter(None, iterable) 相当于 (x for x in iterable if x)。_ (在 Python 2.x 中,您可能想要改用itertools.ifilter。)


另请注意,您可以使用创建列表

[sheet.cell(n,18).value, sheet.cell(n,19).value, sheet.cell(n,20).value]

而不是更长的list((sheet.cell(n,18).value, …))

于 2012-08-19T19:16:08.873 回答
6

在两条线上。可读性胜过简洁性。

你的列表理解也是不必要的,一个 genexp 就可以了。

genre_values = (sheet.cell(n, i).value for i in xrange(18, 21))
genres = ", ".join(value for value in genre_cells if value)
于 2012-08-19T19:16:44.320 回答