将字符串转换为二维列表而不导入

convert string into 2 dimensional list with no imports

我需要将字符串表示形式转换为二维列表。

我正在尝试从文本文件中读取输入。所有输入都遵循标准格式,其中每一行代表一个不同的变量。当我使用 f.readline():

从输入文件中读取以下行时
[[0, 2, 1, 2, 3, 0], [2, 0, 3, 0, 1, 0], [2, 0, 0, 3, 3, 0], [0, 2, 3, 0, 0, 3], [1, 2, 3, 1, 0, 2], [2, 1, 0, 1, 3, 0]]

此行作为字符串读入,但我需要将其转换为二维列表。这个项目的一个限制是我不能使用任何包,只能使用基础 python.

我该怎么做?

类似的东西应该可以工作:

text = "[[0, 2, 1, 2, 3, 0], [2, 0, 3, 0, 1, 0], [2, 0, 0, 3, 3, 0], [0, 2, 3, 0, 0, 3], [1, 2, 3, 1, 0, 2], [2, 1, 0, 1, 3, 0]]"

output = []
for sublist in text.split('], '):
    sublist = sublist.replace('[',  '').replace(']', '')
    data = []
    for number in sublist.split(', '):
        data.append(int(number))
    output.append(data)
print(output)

使用列表理解:

text = "[[0, 2, 1, 2, 3, 0], [2, 0, 3, 0, 1, 0], [2, 0, 0, 3, 3, 0], [0, 2, 3, 0, 0, 3], [1, 2, 3, 1, 0, 2], [2, 1, 0, 1, 3, 0]]"

output = [[int(number) for number in sublist.replace('[', '').replace(']', '').split(', ')] for sublist in text.split('], ')]
print(output)

这个简短的脚本应该可以工作:

string_lists = "[[0, 2, 1, 2, 3, 0], [2, 0, 3, 0, 1, 0], [2, 0, 0, 3, 3, 0], [0, 2, 3, 0, 0, 3], [1, 2, 3, 1, 0, 2], [2, 1, 0, 1, 3, 0]]"

parsed_list = string_lists[1:-2].split("], ")  # remove last 2 brackets and then split into lists

for index, row in enumerate(parsed_list):
    parsed_list[index] = row[1:].split(", ")  # split sublists into individual elements
    parsed_list[index] = [int(num) for num in parsed_list[index]]  # cast each element to int
    
print(parsed_list)

请注意,您不必像我一样创建额外的列表,您可以只处理起始字符串(只需将上面脚本中的“parsed_list”更改为“string_lists” )

这是使用 string 数据类型的 split()rstrip()lstrip() 方法的 step-by-step 方法:

row = '[[0, 2, 1, 2, 3, 0], [2, 0, 3, 0, 1, 0], [2, 0, 0, 3, 3, 0], [0, 2, 3, 0, 0, 3], [1, 2, 3, 1, 0, 2], [2, 1, 0, 1, 3, 0]]'

listOfStrings = [s.rstrip(' ,]') for s in row.split('[')]
listOfStrings = [s for s in listOfStrings if len(s) > 0]
listOfLists = [[int(n.lstrip(' ')) for n in s.split(',')] for s in listOfStrings]
print(listOfLists)

第 1 行创建一个字符串,其中包含原始列表中每个列表的 comma-separated 个值以及一些额外的空字符串。

第 2 行消除了空字符串。

第 3 行创建一个数字列表列表。

让我们先看看一些模式。我们有:

[ [a1, a2, ..., ap1], [b1, b2, ..., bp2], ..., [xx1, xx2, ..., xxpn] ].

我们必须 select 一些分隔符,这将帮助我们将其分组。我可能会选择 ], [,但你甚至可以选择 ],

所以我们必须从字符串中删除 [[]] 以获得清晰的模式。

inp.strip('[]')

我们将其拆分为子列表

inp.strip('[]').split('], [')

现在每个子列表的格式为:

a1, a2, ..., ap1

我们在 , 上拆分它,这样我们就会得到物品。

sublist.split(', ')

我们总结一下,作为一个列表理解:

list_from_string = [[int(item) for item in sublist.split(', ')] for sublist in inp.strip('[]').split('], [')]

多么有趣的问题!找到了这个只迭代字符串一次的简单解决方案:

output_list = list()  # Contains the output
inner_list = None  # Current "row"/"column"
current_value = ""  # Keep track of the current value

for char in list_as_text[1:-1]:
    if char == " ":
        # Ignore spaces
        continue
    elif char.isdigit():  # Add `or char == "."` to support float values
        # Found a digit, keep track of the current value
        current_value += char
    elif char == ",":
        # Found a comma, save the value in inner_list
        inner_list.append(int(current_value))  # Use `float(current_value)` to support float values
        # Start a new current_vale
        current_value = ""
    elif char == "[":
        # We start a new inner_list
        inner_list = list()
    elif char == "]":
        # We completed an inner_list
        output_list.append(inner_list)