如何根据给定列表中的变量拆分字符串?
(我正在使用python 2.7)。
例如:
given_list = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']
st="c#cd#e"
预期结果:
new_list = ['c#','c', 'd#', 'e']
问题在于某些变量以相同的字母开头。该程序将不会查看#号,而是会看到第一个字母。
预先感谢您的帮助。
答案 0 :(得分:5)
使用'|'.join()
从您的named_list中创建正则表达式模式,并技巧性地将带有'#'的那些音符按优先顺序反向排序
import re
given_list = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']
given_list= sorted(given_list, reverse=True)
# ['g#', 'g', 'f#', 'f', 'e', 'd#', 'd', 'c#', 'c', 'b', 'a#', 'a']
st="c#cd#e"
new_list = re.findall('|'.join(given_list), st)
print(new_list)
# ['c#', 'c', 'd#', 'e']
编辑:按照@HenryYik的建议,在reverse=True
中使用sorted(given_list,reverse=True)
答案 1 :(得分:1)
这应该在您的情况下特别有效。
new_list = list()
for x in list(st):
if x!='#':
new_list.append(x)
else:
new_list[-1] += '#'
new_list
输出:
['c#', 'c', 'd#', 'e']
答案 2 :(得分:1)
您可以将given_list
按逆序排列,以便任何包含#的项目都在列表的开头。我对它进行了排序,因为如果我想从字符串中获取“ c”,则可能会将其取为“ c#”的“ c”。之后,您可以浏览given_list
的项目,如果st
包含项目,我们将附加result
列表。为了删除st
中的项目,我正在使用替换方法。
result=[]
given_list= sorted(given_list,reverse=true)
for item in given_list:
if item in st:
st=st.replace(item,'')
result.append(item)
print(result)
# ['e', 'd#', 'c#', 'c']
答案 3 :(得分:0)
我认为您想通读该字符串并检查下一个或下两个字母是否出现在given_list
中。如果可以,您可以将此片段添加到新列表中。
given_list = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']
st="c#cxd#e"
result = []
while len(st) > 0:
if len(st) > 1 and st[0:2] in given_list:
result.append(st[0:2])
st = st[2:]
elif st[0:1] in given_list:
result.append(st[0:1])
st = st[1:]
else:
# You probably want to raise some error if the string is not compliant.
raise KeyError("A sequence of the string does not exist in given_list")
print result
# ['c#', 'c', 'd#', 'e']
即使您将新的变体添加到“ given_list”中,该方法也能很好地工作。只要它们最多只有2个字母。