将字符串转换为二维列表而不导入
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)
我需要将字符串表示形式转换为二维列表。
我正在尝试从文本文件中读取输入。所有输入都遵循标准格式,其中每一行代表一个不同的变量。当我使用 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)