将一组元组转换为值
Convert a set of tuples into values
我正在处理一个需要解析标签的 nlp 项目。我有以下形式的多个标签:一个字符串,它是一组元组。示例:
'{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
但我希望它看起来像这样:
{('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S'), ('Plays & Shows', 'P')}
我尝试在 this question 中使用 literal_eval,但出现无效语法错误。我认为这是因为标签是一个集合,其中包含元组,其中包含未转换为字符串的字符串,因此 literal_eval 变得混乱(只是猜测)。
我试过做一些 bandaid-y 字符串剥离和拆分,但我无法找到一个对不同标签动态工作的解决方案。
您可以使用正则表达式:
import re
s = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
final_data = [re.split(",\s+", i) for i in re.findall("\((.*?)\)", s)]
final_data = [[re.sub("\(|\)", '', b) for b in i] for i in final_data]
new_final_data = set(map(tuple, final_data))
输出:
set([('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S')])
我会这样做:
original = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
splited = original[1:-1].split(',')
splited = list(map(lambda x: x.strip(), splited))
grouped = []
for i in range(0, len(splited), 2):
grouped.append((splited[i][1:], splited[i+1][:-1]))
print(grouped)
使用您喜欢的变量名称。我首先使用 [1:-1]
删除第一个和最后一个字符({
& }
),然后用逗号分隔。然后我 .strip()
每个部分删除初始和最终的空格。最后,我以 2 的步长遍历列表并删除奇数元素的第一个字符 ((
) 和偶数元素的最后一个字符 ()
)。我将生成的元组附加到新列表中。
我正在处理一个需要解析标签的 nlp 项目。我有以下形式的多个标签:一个字符串,它是一组元组。示例:
'{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
但我希望它看起来像这样:
{('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S'), ('Plays & Shows', 'P')}
我尝试在 this question 中使用 literal_eval,但出现无效语法错误。我认为这是因为标签是一个集合,其中包含元组,其中包含未转换为字符串的字符串,因此 literal_eval 变得混乱(只是猜测)。
我试过做一些 bandaid-y 字符串剥离和拆分,但我无法找到一个对不同标签动态工作的解决方案。
您可以使用正则表达式:
import re
s = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
final_data = [re.split(",\s+", i) for i in re.findall("\((.*?)\)", s)]
final_data = [[re.sub("\(|\)", '', b) for b in i] for i in final_data]
new_final_data = set(map(tuple, final_data))
输出:
set([('Entertainment (Adult)', 'S'), ('Performing Arts', 'S'), ('Comedy Club', 'S'), ('$', 'S'), ('Comedy', 'P'), ('18+', 'S')])
我会这样做:
original = '{(Entertainment (Adult), S), (Performing Arts, S), (Comedy Club, S), ($, S), (Comedy, P), (18+, S), (Plays & Shows, P)}'
splited = original[1:-1].split(',')
splited = list(map(lambda x: x.strip(), splited))
grouped = []
for i in range(0, len(splited), 2):
grouped.append((splited[i][1:], splited[i+1][:-1]))
print(grouped)
使用您喜欢的变量名称。我首先使用 [1:-1]
删除第一个和最后一个字符({
& }
),然后用逗号分隔。然后我 .strip()
每个部分删除初始和最终的空格。最后,我以 2 的步长遍历列表并删除奇数元素的第一个字符 ((
) 和偶数元素的最后一个字符 ()
)。我将生成的元组附加到新列表中。