有時,在處理數據時,我們可能會遇到需要將字符串格式的數據列表轉換為元組列表的問題。這可能發生在我們有交叉類型輸入的域中。讓我們討論執行此任務的某些方式。
方法#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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。