用列表分割字符串

时间:2019-10-15 06:57:15

标签: python list

如何根据给定列表中的变量拆分字符串?  
(我正在使用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']

问题在于某些变量以相同的字母开头。该程序将不会查看#号,而是会看到第一个字母。  
预先感谢您的帮助。

4 个答案:

答案 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个字母。