如何将二维列表从字符串转换为 python 列表?

How can I convert a 2d list from string into a python list?

我有一个字符串,它是一个二维数组,包含以下字段 [fruitname,qty,date,time]

示例列表:

['apples',1,'04-07-2022','16:35'],['oranges',5,'04-07-2022','18:35'],['mangoes',10,'04-07-2022','16:00']

我想将以上内容存储在 python (fruitsPurchaseList) 的列表中并访问它。

例如,如果我想获得购买的芒果数量,我会通过类似的方式访问它:

mangoQty = fruitsPurchaseList[2][1]

编辑:

列表还有一些空白。

示例列表:

['apples',1,'04-07-2022','16:35'],['oranges',5,'04-07-2022','18:35'],['mangoes',10,'04-07-2022','16:00'],['bananas',,'04-09-2022','11:00']

编辑:使用原始版本eval;新版本使用标准 ast 模块中的 literal_eval

如果您有一个表示列表列表的字符串并想将其转换为列表,

  1. 可以使用built-inPython函数eval() (documentation)。 eval() 接受一个字符串作为参数并且 将其计算为 Python 表达式(在解析字符串之后)。这 返回计算表达式的结果。如果您使用 eval,您必须确保 eval 的输入源是 trusted.
  2. 应该(见post末尾的讨论)使用函数literal_evaldocumentation) 来自 Python 标准库的 ast 模块。

此代码使用 literal_eval 执行您想要的操作(eval 实现相同的效果,但请参阅下面的注释)。

from pprint import pprint
from ast import literal_eval
# import re 

s = """
[
['apples',1,'04-07-2022','16:35'],
['oranges',5,'04-07-2022','18:35'],
['mangoes',10,'04-07-2022','16:00'],
['bananas',,'04-09-2022','11:00']
]
"""

s = s.replace(",,", ",'',")
# s = re.sub(r', *,', ",'',", s) 

l = literal_eval(s)
pprint(l)
print(f"\nMango Quantity: {l[2][1]}")

以上将所有出现的 ',,' 替换为 ",'',"。如果在空白字段中,逗号之间有任意数量的空格(除此之外别无其他),请删除 s.replace 行并取消注释两个 commented-out 行。使用 re.sub 是更通用的解决方案。

输出

[['apples', 1, '04-07-2022', '16:35'],
 ['oranges', 5, '04-07-2022', '18:35'],
 ['mangoes', 10, '04-07-2022', '16:00'],
 ['bananas', '', '04-09-2022', '11:00']]

Mango Quantity: 10

安全注意事项


在许多情况下,evalliteral_eval 将达到相同的效果,如本例所示。但是,众所周知 eval 具有潜在的危险性。 eval 获取其字符串参数,对其进行解析并将其计算为 Python 表达式。这可以是任意 Python 表达式。一个问题是 Python 允许用户访问和删除系统文件(例如通过 os 模块)。因此 bad-actor 可能会提供您输入 eval 的危险数据,这可能会破坏您的系统。这就是为什么您需要格外小心,确保您 可以信任输入源 ,然后再将其提供给 evalliteral_eval 也接受一个字符串作为参数,但这仅限于包含(引用上面引用的 literal_eval 文档)

Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, None and Ellipsis. This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not capable of evaluating arbitrarily complex expressions[.]

在你的例子中,你知道你的字符串数据代表一个嵌套列表,它应该只有数字和字符串作为元素。所以为了安全起见,使用 literal_eval,它不会计算 non-allowed 表达式。因此,如果您的列表中的元素通常会评估为危险的东西(eval 会评估),literal_eval 将不会评估它——它仅限于 Python 文字结构。在这种情况下,即使您知道并绝对信任您的输入源,使用 literal_eval 也没有什么坏处。

注意安全!

希望这对您有所帮助。如果有 questions/concerns!

请告诉我

您可以使用 append() 将任何元素添加到 python 中的列表 - 这包括其他列表!使用 for 循环遍历每个字符串元素并将其附加到新列表中。访问示例中显示的元素 - listname[element index in whole list][element index in sublist].

string = ['apples',1,'04-07-2022','16:35'],['oranges',5,'04-07-2022','18:35'],['mangoes',10,'04-07-2022','16:00']
fruitsPurchaseList = []

for s in string:
    fruitsPurchaseList.append(s)

print(f"The fruits purchase list is: {fruitsPurchaseList}")

mangoQty = fruitsPurchaseList[2][1]

print(f"The mango quantity is: {mangoQty}")

输出如下:

The fruits purchase list is: $[['apples', 1, '04-07-2022', '16:35'], ['oranges', 5, '04-07-2022', '18:35'], ['mangoes', 10, '04-07-2022', '16:00']]
The mango quantity is: