разделение строки списком - PullRequest
0 голосов
/ 15 октября 2019

Как мне разбить строку в соответствии с переменными в данном списке? (Я использую 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 ]

5 голосов
/ 15 октября 2019

Используйте '|'.join(), чтобы создать шаблон регулярного выражения из вашего данного списка, с трюком, чтобы отсортировать список с этими заметками, где "#" идет первым в обратном алфавитном порядке

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']

РЕДАКТИРОВАТЬ:используйте reverse=True в sorted(given_list,reverse=True), как предложено @ HenryYik

1 голос
/ 15 октября 2019

Вы можете отсортировать given_list в обратном алфавитном порядке, чтобы любой элемент, содержащий #, был в начале списка. Я отсортировал это, потому что, если я хотел взять 'c' из строки, это могло бы быть взято 'c #' s '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']
1 голос
/ 15 октября 2019

Это должно работать именно в вашем случае.


new_list = list()
for x in list(st):
    if x!='#':
        new_list.append(x)
    else:
        new_list[-1] += '#'

new_list

Выход :

['c#', 'c', 'd#', 'e']
0 голосов
/ 15 октября 2019

Я думаю, что вы хотите прочитать строку и проверить, появляются ли следующие или следующие 2 буквы в вашем 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 буквы длиной макс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...