有时,在处理数据时,我们可能会遇到需要将字符串格式的数据列表转换为元组列表的问题。这可能发生在我们有交叉类型输入的域中。让我们讨论执行此任务的某些方式。
方法#1:使用循环+eval() 可以使用上述方法的组合来解决此任务。在此,我们在处理 eval 函数的输入后重新制作字符串以转换为元组列表。
Python3
# Python3 code to demonstrate working of
# Convert String Records to Tuples Lists
# Using loop + eval()
# initializing string
test_str = '[(gfg, ), (is, ), (best, )]'
# printing original string
print("The original string is : " + test_str)
# Convert String Records to Tuples Lists
# Using loop + eval()
res = ''
temp = True
for chr in test_str:
if chr == '(' and temp:
res += '("'
temp = False
continue
if chr == ', ' and not temp:
res += '"'
temp = True
res += chr
res = eval(res)
# printing result
print("The list of Tuples is : " + str(res))
The original string is : [(gfg, ), (is, ), (best, )] The list of Tuples is : [('gfg', ), ('is', ), ('best', )]
时间复杂度:O(n),其中 n 是输入字符串的长度。
辅助空间:O(n),因为我们正在创建一个长度为 n 的新字符串 ‘res’,然后将其转换为元组列表。
方法#2:使用正则表达式+列表理解上述函数的组合用于执行此任务。在此,我们使用正则表达式函数来执行解析字符串的任务,列表理解有助于重建记录列表。
Python3
# Python3 code to demonstrate working of
# Convert String Records to Tuples Lists
# Using regex + list comprehension
import re
# initializing string
test_str = '[(gfg, ), (is, ), (best, )]'
# printing original string
print("The original string is : " + test_str)
# Convert String Records to Tuples Lists
# Using regex + list comprehension
regex = re.compile(r'\((.*?)\)')
temp = regex.findall(test_str)
res = [tuple(sub.split(', ')) for sub in temp]
# printing result
print("The list of Tuples is : " + str(res))
The original string is : [(gfg, ), (is, ), (best, )] The list of Tuples is : [('gfg', ''), ('is', ''), ('best', '')]
时间复杂度:在)
辅助空间:在)
方法#3:使用递归方法。
算法:
- 定义 convert_to_tuple 函数,该函数采用四个参数 - 字符串、i、长度和元组。
- 将起始变量定义为当前索引 i。
- 当当前索引 i 小于字符串 length 的长度时,执行以下操作:
A。如果当前字符是左括号“(”,则使用新索引值 i+1 递归调用 convert_to_tuple 函数。
b.如果当前字符是右括号 ‘)’,则将起始索引 start 到当前索引 i 的子字符串作为元组添加到元组列表中,并返回当前索引 i。
C。将当前索引 i 加 1。 - 返回当前索引 i。
Python3
# Python3 code to demonstrate working of
# Convert String Records to Tuples Lists
# Using recursion
# Function to find matching closing bracket and
# convert it to a tuple
def convert_to_tuple(string, i, length, tuples):
start = i
while i < length:
if string[i] == '(':
i = convert_to_tuple(string, i + 1, length, tuples)
elif string[i] == ')':
tuples.append(tuple(string[start :i].split(', ')))
return i
i += 1
return i
# initializing string
test_str = '[(gfg, ), (is, ), (best, )]'
# printing original string
print("The original string is : " + test_str)
# Convert String Records to Tuples Lists
# Using recursion
tuples = []
convert_to_tuple(test_str, 0, len(test_str), tuples)
# printing result
print("The list of Tuples is : " + str(tuples))
#this code contributed by tvsk
The original string is : [(gfg, ), (is, ), (best, )] The list of Tuples is : [('gfg', ''), ('is', ''), ('best', '')]
时间复杂度:O(n),其中 n 是输入字符串的长度。这是因为该函数对输入字符串中的每个字符恰好迭代一次,并在每次迭代时执行恒定时间操作。递归调用还会增加整体时间复杂度的常数时间。
辅助空间:O(m),其中 m 是输入字符串中元组的数量。这是因为该函数为遇到的每对左括号和右括号创建一个新元组,并将它们存储在元组列表中。元组列表的最大大小等于输入字符串中元组的数量,它与输入的大小成正比。
方法#4:使用json.loads()
- 导入 json 模块。
- 将 test_str 变量初始化为包含 JSON 格式数据的字符串。
- 使用 json.loads() 将 JSON 格式的数据解析为 Python 列表列表。
- 使用列表推导式创建一个新的元组列表,其中每个元组包含步骤 3 中相应子列表的第一个元素。
- 过滤结果列表以删除第一个元素为空字符串的任何元组。
- 打印结果元组列表。
Python3
import json
test_str = '[["gfg", ""], ["is", ""], ["best", ""]]'
tuple_list = [(x[0],) for x in json.loads(test_str)]
print(tuple_list)
#This code is contributed by Vinay Pinjala.
[('gfg',), ('is',), ('best',)]
时间复杂度:
json.loads() 的时间复杂度为 O(n),其中 n 是输入字符串的长度。
列表推导式的时间复杂度为 O(n),其中 n 是输入列表的长度。
该过滤器的时间复杂度为 O(m),其中 m 是结果列表中的元素数量(如果某些元素被过滤掉,则可能小于 n)。
因此,代码的总体时间复杂度为O(n+m)。
空间复杂度:
test_str 变量占用 O(n) 空间,其中 n 是输入字符串的长度。
生成的元组列表占用 O(m) 空间,其中 m 是结果列表中的元素数量(如果某些元素被过滤掉,则可能小于 n)。
json_list 变量占用 O(n) 空间,其中 n 是输入字符串的长度。
因此,代码的整体空间复杂度为O(n+m)。
方法#5:使用ast.literal_eval()
分步方法:
- 导入AST模块。
- 定义需要转换为元组列表的字符串。
- 调用ast.literal_eval()以字符串作为参数的函数。
- ast.literal_eval()函数将字符串计算为 Python 表达式并返回结果对象。
- 分配结果到一个变量。
- 打印结果.
下面是上述方法的实现:
Python3
import ast
# initializing string
test_str = '[("gfg", ), ("is", ), ("best", )]'
# printing original string
print("The original string is : " + test_str)
# Convert String Records to Tuples Lists
# Using ast.literal_eval()
res = ast.literal_eval(test_str)
# printing result
print("The list of Tuples is : " + str(res))
The original string is : [("gfg", ), ("is", ), ("best", )] The list of Tuples is : [('gfg',), ('is',), ('best',)]
时间复杂度:ast.literal_eval() 的时间复杂度为 O(n),其中 n 是要计算的字符串的长度。因此,该方法的时间复杂度为O(n)。
辅助空间:O(n),其中 n 是要计算的字符串的长度。这是因为 ast.literal_eval() 方法创建了一个解析树来评估字符串,并且解析树的大小与输入字符串的大小成正比。
相关用法
- Python String format()用法及代码示例
- Python String capitalize()用法及代码示例
- Python String center()用法及代码示例
- Python String casefold()用法及代码示例
- Python String count()用法及代码示例
- Python String endswith()用法及代码示例
- Python String expandtabs()用法及代码示例
- Python String encode()用法及代码示例
- Python String find()用法及代码示例
- Python String index()用法及代码示例
- Python String isalnum()用法及代码示例
- Python String isalpha()用法及代码示例
- Python String isdecimal()用法及代码示例
- Python String isdigit()用法及代码示例
- Python String isidentifier()用法及代码示例
- Python String islower()用法及代码示例
- Python String isnumeric()用法及代码示例
- Python String isprintable()用法及代码示例
- Python String isspace()用法及代码示例
- Python String istitle()用法及代码示例
- Python String isupper()用法及代码示例
- Python String join()用法及代码示例
- Python String ljust()用法及代码示例
- Python String rjust()用法及代码示例
- Python String lower()用法及代码示例
注:本文由纯净天空筛选整理自manjeet_04大神的英文原创作品 Python – Convert String Records to Tuples Lists。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。