【问题标题】:Pythonic way to modify all items in a list, and save list to .txt filePythonic 方式来修改列表中的所有项目,并将列表保存到 .txt 文件
【发布时间】:2012-04-28 01:05:30
【问题描述】:

我有一个字符串列表。

theList = ['a', 'b', 'c']

我想在字符串中添加整数,得到如下输出:

newList = ['a0', 'b0', 'c0', 'a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3']

我想将其保存为 .txt 文件,格式如下:

a0
b0
c0
a1
b1
c1
a2
b2
c2
a3
b3
c3

尝试:

theList = ['a', 'b', 'c']
newList = []

for num in range(4):
    stringNum = str(num)
    for letter in theList:
        newList.append(entry+stringNum)

with open('myFile.txt', 'w') as f:
    print>>f, newList

现在我可以保存到文件 myFile.txt 但文件中的文本为:

['a0', 'b0', 'c0', 'a1', 'b1', 'c1', 'a2', 'b2', 'c2', 'a3', 'b3', 'c3']

非常欢迎任何关于实现我的目标的 Pythonic 方法的提示,

【问题讨论】:

  • 回答者,请注意,OP 要求提供“更 Pythonic”的解决方案,而不是更短或更复杂的解决方案。

标签: python file list


【解决方案1】:

这可能会完成你的工作

with open('myFile.txt', 'w') as f:
    for row in itertools.product(range(len(theList)+1),theList):
        f.write("{1}{0}\n".format(*row))

【讨论】:

  • 谢谢,我不熟悉itertools
【解决方案2】:

如果你想稍微压缩你的代码,你可以这样做:

>>> n = 4
>>> the_list = ['a', 'b', 'c']
>>> new_list = [x+str(y) for x in the_list for y in range(n)]
>>> with open('myFile.txt', 'w') as f:
...     f.write("\n".join(new_list))

【讨论】:

  • 我认为这实际上是 less Pythonic 比 OP 的解决方案:1)它使用 maplambda,它们不像 Python 作为列表推导或直接list.append, 2) map+lambda+itertools 比 KISS 解决方案更复杂,可能更慢,使它不像 Python 那样的禅宗,3) 它不使用 with 语句,所以文件可能不会被关闭(尽管在 CPython 中是关闭的),4)最好使用 gzip 压缩你的代码。 :-)
  • 我不认为这非常易读(简单胜于复杂),尽管在某种程度上将所有这些压缩到这个短代码中非常酷。
  • 我知道,自从我开始学习haskell,我的代码越来越难看。呃。
  • 我不知道你可以在这样的一行上有 for 循环,那是相当压缩的!
  • 虽然,对于输出,我必须颠倒 for 循环的顺序 :)
【解决方案3】:

您所做的很好——Zen of Python 中的要点之一是“简单胜于复杂”。您可以轻松地将其重写为单行代码(可能使用嵌套列表推导式),但您所拥有的内容很好且易于理解。

但我可能会做一些小改动:

  • 通常最好通过 Python 的 json.dump(newList, f) 在文本文件中使用更便携的序列化,例如 JSON。不过,很适合使用 with 语句。
  • 您不需要单独的 stringNum 变量 -- 追加内的 str(num) 也一样好
  • 遵循PEP-8 命名约定,所以new_list 而不是newList
  • 吹毛求疵:您的问题标题显示“修改列表中的所有项目”,而实际上您的代码正在构建一个新列表。通常这是 Python 风格的事情——就地修改列表等副作用通常不太有用。

【讨论】:

  • 查找 JSON 并阅读 PEP-8 约定。在附录内 - 谢谢(现在我看到了一个非常明显的:D)你是对的,我打算修改列表,但在我的代码中我创建了一个新列表。这似乎也是一个更好的主意。谢谢
【解决方案4】:

代替最后一行,使用:

f.write("\n".join(newList))

这会将newList中的字符串以换行符分隔,写入f。请注意,如果您实际上不需要 newList,则可以组合两个循环并随时编写字符串:

the_list = ['a', 'b', 'c']

with open('myFile.txt', 'w') as f:
    for num in range(4):
        for letter in the_list:
            f.write("%s%s\n" % (letter, num))

【讨论】:

  • 不错 .. 并且总体上偏爱 xrange 而不是 range(尽管数量如此之少,这并不重要)
  • 最好在本站的答案中使用range,因为它与python 3兼容。
  • @jamylak 你能告诉我我仍然使用 2.6/7 进行编码 .. 感谢您指出这一点。
  • 我不明白。我的意思是,对于查看答案的可能正在使用 python 2.x 或 python 3.x 的人来说,这会更好,因此无论哪种方式,它都对他们有用。
  • @jamylak 是的,我正在为我的原始评论提供解释,并感谢您的评论。一切都很好。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多