0

我想知道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

4 回答 4

2

作为对您的编辑的回应——这是一种比较容易处理的方法:

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

但它仍然很难阅读。join我会使用and摆脱内部循环reversed

于 2012-08-02T18:26:03.037 回答
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()方法将该字符串作为传递给它的列表中每个元素之间的分隔符
  • 列表推导可以嵌套,但它是由内而外解释的,这对某些人来说是违反直觉的(包括我在内)
  • 您的代码将每个新元素放在字符串的开头,我通过在加入之前反转列表来完成
于 2012-08-02T18:08:03.507 回答
1
csv='\n'.join([','.join(map(str,row)) for row in purge_list])

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

编辑:我错过了代码中的反向行。所以,FJ的答案是正确的。

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

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

这是您的代码 usingwith语句的等效项:

with open(fnam, 'w+') as file:
    file.writelines('%s\n' % line for line in [','.join(map(str,row)) for row in purge_list])
于 2012-08-02T18:19:35.747 回答
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()从上面删除调用。

于 2012-08-02T18:20:17.667 回答