将一组元组转换为值

将一组元组转换为值

问题描述:

我正在处理一个需要解析标签的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字符串条和分割,但我无法得到一个解决方案,将动态地为不同的标签。

+0

如果标签包含逗号,括号?首先要正确生成列表不是更简单吗? –

+0

标签将始终采用相同的形式:一组包含两个值的元组。另一个标记示例是'{(All Ages,S),($,S),(Alternative&Rock,S),(Concerts&Live Music,P)}' In []: – Daniel

+0

我会尝试首先逗号然后加入成对。 – Adirio

您可以使用正则表达式:

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')]) 
+0

这可以工作,但对于带有单个标签的字符串没有任何返回。例如,'{(音乐会和现场音乐,P)}' – Daniel

+0

@Daniel现在再试一次代码。 – Ajax1234

我会做这种方式:

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]删除第一个和最后一个字符({ & }),然后用逗号分隔。然后我每个部分都删除初始和最终的空格。最后我遍历整个列表,步骤为2,删除奇数元素的第一个字符(()和偶数元素的最后一个字符())。我将结果元组追加到一个新列表中。