【问题标题】:Python: Why does list import using quotation marks, how can I avoid this/get rid of them?Python:为什么列表导入使用引号,我该如何避免/摆脱它们?
【发布时间】:2012-04-18 09:22:49
【问题描述】:

这里的问题很简单,但困扰我的时间足够长。代码如下所示:

f4 = open("genomekey2.txt", 'rb')
keyline = f4.readline()
keygenomes = []
for keyline in f4:
   keygenomes.append(keyline[:-1])

genomekey2.txt 文件格式如下所示

['Prochlorococcus marinus str. MIT 9202']
['Prochlorococcus marinus str. NATL1A']
['Synechococcus sp. RS9917']
['Nostoc sp. PCC 7120']
['Synechococcus sp. JA-2-3B'a(2-13)']

问题是当我打印基因组密钥列表时,它包含我想要的所有条目,但在列表中找到的每个 [] 周围都有引号。我想去掉引号,这样我就可以将它与另一个列表进行比较,但到目前为止还没有找到方法。我试过了……

for a in keygenomes:
    a.replace('"', '')

但这似乎不起作用。我宁愿一个根本不添加引号的解决方案。它们到底有什么用,代码的哪一部分(.append、.readline())负责添加它们?这里有很多初学者问题,但你们看起来很不错。

编辑:我最终想将它与这样格式化的列表进行比较

[['Arthrospira maxima CS-328'], ['Prochlorococcus marinus str. MIT 9301'],['Synechococcus sp. CC9605'],['聚球藻。 WH 5701'], ['Synechococcus sp. CB0205'], ['Prochlorococcus marinus str. MIT 9313'],['Synechococcus sp. JA-3-3Ab'],['Trichodesmium erythraeum IMS101'],['Synechococcus sp. PCC 7335'], ['Trichodesmium erythraeum IMS101'], ...

编辑:所以我想我可以通过组合答案来解决问题,谢谢大家的帮助!引用干扰了列表比较,所以我也只是将它们添加到第一个列表中,尽管我认为它只是模仿作为字符串输入的列表(我现在认为我理解其中的区别)它似乎工作

f4 = open("genomekey2.txt", 'rb')
keyline = f4.readline()
keygenomes = []
for keyline in f4:
    keygenomes.append(keyline[:-1])

specieslist = " ".join(["%s" % el for el in specieslist])

nonconservedlist = [i for i in keygenomes if i not in specieslist]

编辑:是的,上述方法有效,但在了解问题后我在这里找到了更优雅的解决方案 (http://forums.devshed.com/python-programming-11/convert-string-to-list-71857.html)更好的感谢你们的帮助是这样的:

for keyline in f4:
    keyline = eval(keyline)
    keygenomes.append(keyline)

谢谢!

【问题讨论】:

  • 如果您确定输入文件的每一行格式为:['...'] 那么您应该能够从字符 [2:-2] 开始,我认为它是在 Python 中。
  • 我不认为这是完全相同的问题?
  • @Wooble:OP 想要比较列表。链接的线程对此有何帮助?
  • @cc211:您将print my_list 打印的内容与my_list 本身混淆了。如果你想比较两个列表,print my_list 的输出是无关紧要的。

标签: python list replace


【解决方案1】:

a.replace(...)返回修改后的字符串,不修改a

因此,您需要实际替换数组中的条目,或者在将它们放入数组之前修复它们。

keygenomes = [ a.replace('"', '') for a in keygenomes ]

编辑:

我认为我没有仔细阅读这个问题 - " 在您打印字符串时出现 - 它不是字符串本身的一部分。

【讨论】:

  • 即使有了该代码,我仍然得到相同的输出 ["['Prochlorococcus marinus str.NATL1A']", "['Synechococcus sp. RS9917']", "['Nostoc sp. PCC 7120']", "['Synechococcus sp. JA-2-3B'a(2-13)']", with f4 = open("genomekey2.txt", 'rb') keyline = f4.readline() keygenomes = [] for keyline in f4: keygenomes.append(keyline[:-1]) keygenomes = [ a.replace('"', '') for a in keygenomes ] print keygenomes 我做错了哪一点?跨度>
  • @cc211 我想我没有仔细阅读这个问题 - 当你打印一个字符串时出现“ - 它不是字符串本身的一部分。
【解决方案2】:

根据您想要比较列表的内容,您似乎想要一个列表列表而不是字符串列表......也许是这个?

f4 = open("genomekey2.txt", 'rb')
keygenomes = []
for keyline in f4.readlines():
    if keyline:
        keygenomes.append(eval(keyline.strip()))

您将遇到以下行的问题:

['Synechococcus sp. JA-2-3B'a(2-13)']

引号不正确,它会破坏 eval。是否可以混合引用?改为这样...

["Synechococcus sp. JA-2-3B'a(2-13)"]

【讨论】:

  • 没见过这个!这就是我回来并进行编辑的内容。我将手动编辑那些 ' 在我认为的方式中的少数物种。
【解决方案3】:

试试这样的:

keygenomes = []
f4 = open("genomekey2.txt", 'rb')
keyline = f4.readline()
for keyline in f4:
    keyline = keyline.strip()
    if keyline and keyline.startswith("['") and keyline.endswith("']"):
        keygenomes.append(keyline[2:-2])

【讨论】:

  • 这让我得到了最接近我需要的输出,但我仍然得到 ['Prochlorococcus marinus str. NATL1A','聚球藻属。 RS9917','发菜 sp。 PCC 7120',“Synechococcus sp. JA-2-3B'a(2-13)”,'Synechococcus sp. RS9916', 'Prochlorococcus marinus str. AS9601',理想情况下会有 [['Prochlorococcus marinus str. NATL1A'],['Synechococcus sp。 RS9917'],['Nostoc sp. PCC 7120'],["Synechococcus sp. JA-2-3B'a(2-13)"],['Synechococcus sp. RS9916'], ['Prochlorococcus marinus str. AS9601']等
【解决方案4】:

您的replace 使用了错误的字符串;您正在尝试删除单引号,但您的字符串是双引号。此外,由于字符串不是可变的,因此替换不是就地的,您必须使用返回值。

keygenomes.append(keyline[:-1].replace("'", ""))

【讨论】:

  • 所以有点可怕的是,我刚刚在编辑中添加了一些东西,我正在比较它的东西需要 [] 内的单引号,我认为我得到的输出是你的建议上面是'[Cyanothece sp。 PCC 7822]'、'[Oscillatoria sp. PCC 6506]'、'[Cylindrospermopsis raciborskii CS-505]'、'[Nostoc azollae 0708]'、'[Synechococcus sp. WH 7805]']
【解决方案5】:

一个快速而肮脏的解决方案是跳过该行的前两个和最后两个字符

f4 = open("genomekey2.txt", 'rb')
keyline = f4.readline()
keygenomes = []
for keyline in f4:
   # CHANGE HERE
   keygenomes.append(keyline[2:-2])

否则使用正则表达式

g = re.match(("^\['(?P<value>.*)'\]"), "['Synechococcus sp. JA-2-3B'a(2-13)']")
g.group(1)
"Synechococcus sp. JA-2-3B'a(2-13)"

【讨论】:

  • 快速而肮脏的解决方案不带走引号它带走其他字符,这就是我之前抛出的问题
  • @cc211: 你想去掉哪些引号?我认为您将 python 列表对象与字符串列表混淆了,这些字符串列表看起来像 python 中列表对象的 repr
  • @cc211:您可以编辑您的问题以准确显示您希望输出的外观吗?最好在 python 解释器提示符中。
猜你喜欢
  • 2011-08-14
  • 2019-06-07
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多