可以使用列表推导列出转换为字符串吗?

时间:2012-08-02 18:02:01

标签: python list-comprehension

我想知道以下示例中的for row in purge_list:是否正常,可以使用列表推导转换为一行:

fnam = "purge_list.csv"
fH = open(fnam, 'w+')

out_str = ""

for row in purge_list:
    for str_element in row:
        out_str = str(str_element) + "," + out_str

    out_str = out_str + "\n"
    fH.write(out_str)
    out_str = ""

fH.close()

我的目标是获取列表中返回的结果,并将其写为逗号分隔的字符串。

感谢。

修改

这就是数据的样子:

Device ID   Last Read   PremiseID   
80622121    2011-12-05 23:00:00 304096000   
80630175    2012-04-25 23:09:46 315080000   
80623426    2012-04-25 23:00:00 601012500   
80622084    2012-07-31 23:00:00 604013000   
80581425    2012-07-31 23:00:00 604034000

我很欣赏对这个答案,评论和答案的关注。

4 个答案:

答案 0 :(得分:2)

响应您的编辑 - 这是一种易于处理的方式:

FH.writelines([','.join(str(x) for x in reversed(row)) for row in purge_list])

但它仍然很难阅读。我只想使用joinreversed摆脱内循环。

答案 1 :(得分:1)

是的:

>>> purge_list = [ ["a","b"], ["c","d"] ]
>>> ",".join( reversed( [ str(element) for row in purge_list for element in row  ]) )
'd,c,b,a'

注意:

  • 字符串上的join()方法将该字符串作为传递给它的列表中每个元素之间的分隔符
  • 列表理解可以嵌套,但它是由内而外解释的,这对某些人来说是违反直觉的(包括我在内)
  • 您的代码将每个新元素放在字符串的开头,我通过在连接之前反转列表来完成

答案 2 :(得分:1)

csv='\n'.join([','.join(map(str,row)) for row in purge_list])

当然你可以用另一个字符串理解来替换地图,但我认为地图更简单。

编辑: 我错过了代码中的反转行。所以,F.J的回答是正确的。

再次编辑: 要获得一个尾随的新行(最后一行之后的新行),请使用代码:

csv=['%s\n' % line for line in [','.join(map(str,row)) for row in purge_list]]

以下是使用with声明代码的等效代码:

with open(fnam, 'w+') as file:
    file.writelines('%s\n' % line for line in [','.join(map(str,row)) for row in purge_list])

答案 3 :(得分:1)

我认为以下应该做你想做的事情,如果不是你想要的结果,请提供一些示例输入和预期输出:

out_str = '\n'.join(','.join(map(str, reversed(row))) for row in purge_list)

您的代码似乎按顺序打印每一行,但每行中的元素都是相反的并用逗号连接,这就是我的代码应该做的。

你的代码做的另一件事(我认为这是无意的)是打印副本的一些行。

','.join(map(str, reversed(row)))相当于你的内部for循环(除了你的内容包括一个尾随的逗号),通过将它放在for row in purge_list生成器中我们可以得到每行的正确输出,然后'\n'.join用于从所有行创建一个大字符串。您可能还需要一个尾随换行符,您可以将+ '\n'添加到我的单行的最后一行。

修改:如果您不想撤消任何内容,只需从上方移除reversed()来电。