简化列表理解

时间:2012-08-19 19:14:25

标签: python

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

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

2 个答案:

答案 0 :(得分: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(…)部分的generator expression。您可以用范围或其他内容替换元组(18, 19, 20)

filter(None, iterable) is equivalent to (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, …))

答案 1 :(得分: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)