在Python中将列表列表中的元组字符串转换为列表项

在Python中将列表列表中的元组字符串转换为列表项,python,eval,abstract-syntax-tree,Python,Eval,Abstract Syntax Tree,列表l包含由两种类型的列表组成的项,第一种是由字符串组成的可接受列表,第二种是由包含字符串的元组字符串组成。第二种类型的所有列表都具有相同的长度-2。我想将第二种类型的所有列表转换为与第一种类型相同的约定,如下所示(l2是更新的列表) 编辑:我应该澄清,我处理的实际列表远不止两项,因此我需要一个循环函数来适应这一点 l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['

列表
l
包含由两种类型的列表组成的项,第一种是由字符串组成的可接受列表,第二种是由包含字符串的元组字符串组成。第二种类型的所有列表都具有相同的长度-2。我想将第二种类型的所有列表转换为与第一种类型相同的约定,如下所示(
l2
是更新的列表)

编辑:我应该澄清,我处理的实际列表远不止两项,因此我需要一个循环函数来适应这一点

l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]

l2 = [['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
以下是我目前为止的观点:

from csv import reader
from cStringIO import StringIO

l2 = []

for i in l:
    if len(i) == 2:
        filestr = StringIO(i[0] + i[1])
        csv_reader = reader(filestr, quotechar="'")
        for t in csv_reader:
            l2.append(t)
    else:
        l2.append(i)
如果且仅当您信任输入,您可以对其进行评估:

l2 = eval(l[0][0])
我不完全理解整个输入的结构,因此我无法帮助您对所有输入进行循环。

如果并且只有当您信任输入时,才能对其进行评估:

l2 = eval(l[0][0])
我不完全理解整个输入的结构,因此我无法帮助您循环所有输入。

您可以使用ast:

>>> import ast
>>> l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
>>> l2=[e for e in ast.literal_eval(l[0][0])]
>>> l2+=[e for e in ast.literal_eval(l[0][1])]
>>> l2=[l2]
>>> l2.append(l[1])

>>> l2
[['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
您可能知道,
eval
存在一些真正的安全问题<代码>ast非常安全,因为它只能生成基于Python的数据结构

您可以使用ast:

>>> import ast
>>> l = [["('N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '')", "('61060', '61060')"], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]
>>> l2=[e for e in ast.literal_eval(l[0][0])]
>>> l2+=[e for e in ast.literal_eval(l[0][1])]
>>> l2=[l2]
>>> l2.append(l[1])

>>> l2
[['N', '', 'SHOWERS', '', 'RD', '11734', '11734', '', '', '61060', '61060'], ['', '', 'NORA', '', 'RD', '10301', '10999', '10400', '10998', '61089', '61089']]

您可能知道,
eval
存在一些真正的安全问题<代码>ast非常安全,因为它只能生成基于Python的数据结构

我建议使用列表而不是元组,然后在必要时为列表/子列表/和列表的子列表编制索引,以实现您想要的功能


另一个想法是创建一个您想要的结构类。放置对列表进行切片的方法。看起来您希望在一个元组中包含前9项,而在另一个元组中包含最后两项。这将是一个很好的方式来区分他们了

我建议使用列表而不是元组,然后在必要时为列表/子列表/和列表的子列表编制索引,以实现您想要的功能


另一个想法是创建一个您想要的结构类。放置对列表进行切片的方法。看起来您希望在一个元组中包含前9项,而在另一个元组中包含最后两项。这将是一个很好的方式来区分他们了

这不是csv问题,因为您没有csv。(事实上,你让我困惑了一段时间,因为我试图想象csv文件是什么样子的!)

  • 建立列表是否需要规范化的“测试”(
    is\u tuple\u string\u row
    下面的函数)
  • 用于将元组字符串安全地转换为实际元组
  • 用于将所有元组组合成单个序列
  • 下面的完整代码作为生成器
    normalized_list()
    实现


    这不是csv问题,因为您没有csv。(事实上,你让我困惑了一段时间,因为我试图想象csv文件是什么样子的!)

  • 建立列表是否需要规范化的“测试”(
    is\u tuple\u string\u row
    下面的函数)
  • 用于将元组字符串安全地转换为实际元组
  • 用于将所有元组组合成单个序列
  • 下面的完整代码作为生成器
    normalized_list()
    实现


    在这段代码中有两个名为
    i
    的标识符。你能给它们起个更有意义的名字,这样它们就不会冲突了吗?此外,缩进已关闭,需要修复。为了清晰起见,我区分了标识符,但我没有发现任何缩进问题。你能指出它在哪里吗?csv\U阅读器中t的
    下面的行:
    需要进一步缩进。我还发现了这个:
    如果len(I)是2:
    。您应该检查是否相等,而不是标识。@user1185790:您仍然有
    i=i[0]+i[1]
    ,这意味着您使用
    i
    有两个不同的目的。在这种情况下,它不会破坏任何东西,但它令人困惑。由于您只使用一次该值,因此最好只编写
    file=StringIO(i[0]+i[1])
    。最后一个挑剔的地方是:
    file
    是Python内置的。将其重命名为其他文件(
    fake_file
    )将是一个好主意。事实上,我认为如果你纠正了我所有的小毛病,你的代码可能真的能工作!在这段代码中有两个名为
    i
    的标识符。你能给它们起个更有意义的名字,这样它们就不会冲突了吗?此外,缩进已关闭,需要修复。为了清晰起见,我区分了标识符,但我没有发现任何缩进问题。你能指出它在哪里吗?csv\U阅读器中t的
    下面的行:
    需要进一步缩进。我还发现了这个:
    如果len(I)是2:
    。您应该检查是否相等,而不是标识。@user1185790:您仍然有
    i=i[0]+i[1]
    ,这意味着您使用
    i
    有两个不同的目的。在这种情况下,它不会破坏任何东西,但它令人困惑。由于您只使用一次该值,因此最好只编写
    file=StringIO(i[0]+i[1])
    。最后一个挑剔的地方是:
    file
    是Python内置的。将其重命名为其他文件(
    fake_file
    )将是一个好主意。事实上,我认为如果你纠正了我所有的小毛病,你的代码可能真的能工作!对不起,我应该澄清一下。实际的输入列表不止两项,因此我需要一个循环来解决这个问题。您可以使用
    ast.literal\u eval
    来避免安全问题。@user1185790:我理解,但是eval只对第一项中的子项起作用。我想第一个项目正好有两个子项目这一事实是相关的,但是你必须自己处理细节。对不起,我应该澄清一下。实际的输入列表不止两项,因此我需要一个循环来解决这个问题。您可以使用
    ast.literal\u eval
    来避免安全问题。@user1185790:我理解,但是eval只对第一项中的子项起作用。我想第一个项目正好有两个子项目这一事实是相关的,但是