Мне нужно преобразовать эту строку в список в Python - PullRequest
0 голосов
/ 23 марта 2020

У меня есть эта строка:

? i.iaaa.iaaa aii.aai.iaaa ia.iiii.i   aiai.aii.iaaa aii.iiii.i   aiai.iaaa.i i.i aii.iiii.i ia.aai.i   aii.iiii.i aii.aai.iaaa aiii.ii.iaaa   , aiii.iiii.i aiii.iiai.i aiii.iiai.i i.ii.iaaa i.i

Я хочу, чтобы она выглядела следующим образом:

[['?'] ['i','iaaa','iaaa'],['aii','aai','iaaa'],['ia','iiii','i'],[' '],['aiai','aii','iaaa'],['aii','iiii','i'],[' '],['aiai','iaaa','i'],['i','i'],['aii','iiii','i'],['ia','aai','i'],[' '],['aii','iiii','i'],['aii','aai','iaaa'],['aiii','ii','iaaa'],[' '],[','],['aiii','iiii','i'],['aiii','iiai','i'],['aiii','iiai','i'],['i','ii','iaaa'],['i','i']

Короче говоря, точки между a и i должны быть удален. Другие знаки препинания должны быть в их собственном вложенном списке. Комбинации a и i из одного пробела в другой должны быть вместе во вложенном списке. Если есть несколько пробелов, их следует заменить одним пробелом в списке

Я уже пробовал:

et=input('Enter message here: \n')
#declaration of variables
pt=[]
i=0
#convert string to list
for i in range(0,len(et)):
    if et[i] == '.' and et[i+1] == 'a' or 'i':
        pass
    elif et[i] == 'a' or 'i' and et[i-1] == 'a' or 'i':
        pt[-1]= pt[-1] + et[i]
    else:
        pt.append(list(et[i]))

print(pt)

Это не работает. Выход:

[]

Ответы [ 4 ]

1 голос
/ 23 марта 2020

Пример решения этого с использованием группового метода от itertools.

from itertools import groupby

separator = ' '

groups = groupby(data, lambda key: key == separator)

result = []
for is_separator, group in groups:
    # Group is an iterator over every character in that group
    # Convert it into str
    group_str = ''.join(group)

    if is_separator:
        # Skip the group, if it's made out of one separator
        if len(group_str) > 1:
            result.append(list(separator))
    else:
        result.append(group_str.split('.'))
1 голос
/ 23 марта 2020

Как уже упоминалось в другом месте, правильным способом решения такой проблемы является использование .split () и .join () и .replace () в строках и списках, или использование регулярных выражений. Для полноты изложения приведем ответ, основанный на вашей попытке.

Основная ошибка, возникшая при попытке использовать ярлыки в логических логиках c. На естественном языке, когда мы говорим «яблоко зеленое и круглое», мы имеем в виду, что яблоко зеленое, а яблоко круглое. В кодировании мы должны сказать это явно. Например, следующее:

if item[i] == "a" or "b"

Python спросит, является ли

item[i] == "a"

истиной, а затем спросит, является ли

"b"

истиной. Поскольку «b» является строкой и имеет значение, она всегда будет считаться истинной в Python. В результате это:

if item[i] == "a" or "b"

всегда верно. То, что вы хотите, это:

if item[i] == "a" or item[i] == "b"

или более кратко:

if item[i] in ("a", "b")

Также обратите внимание, что и имеет приоритет над или. Если вы хотите или хотите иметь приоритет, вы должны добавить круглые скобки.

Помимо этого, я думаю, что вы слишком оптимистично c пытались решить эту проблему с помощью проверки индекса списка, но не добавляли переменную подсписка в отслеживать.

# Please please please give variables names.
inputted = input('Enter message here: \n')


# This is Python. Variables don't need to be declared.
# The list declarations here are only because I actually want to initialise them (so that I can append to the empty list).
# But i=0 is entirely redundant.
result = []
sublist = []

#convert string to list  (this comment is a bit useless. to convert a string to a list you just type list(your_string). What you are doing is somthing else)

for i in range(len(inputted)):  # The starting index will default to 0, and it isn't against PEP 8 to use this implicit behaviour, because it is so common and well understood.

    # Notice the boolean logic syntax.
    if inputted[i] == '.' and (inputted[i+1] == 'a' or inputted[i+1]=='i'):
        # Start a new item in the sublist
        sublist.append('')

    elif inputted[i] == 'a' or inputted[i] == 'i':
        # add to last entry in sub list.
        try:
            sublist[-1] = sublist[-1] + inputted[i]
        # The first time you try do this, there is nothing to append to.
        except IndexError:
            sublist = [inputted[i]]
    # Here we check for multiple whitespaces, but if there are multiple whitespace, 
    # we also want to know that we haven't already added one.
    elif inputted[i] == ' ' and inputted[i+1] == ' ' and sublist != [' ']:
        # multiple whitespace. add whitespace sublist.
        if sublist:
            result.append(sublist)
        sublist = [' ']

    # Single whitespace. start a new sublist
    elif inputted[i] == ' ':
        if sublist:
            result.append(sublist)
        sublist = []

    # punctuation
    else:
        sublist = [inputted[i]]

print(result)
1 голос
/ 23 марта 2020

Вы можете попробовать это.

x='? i.iaaa.iaaa aii.aai.iaaa ia.iiii.i   aiai.aii.iaaa aii.iiii.i   aiai.iaaa.i i.i aii.iiii.i ia.aai.i   aii.iiii.i aii.aai.iaaa aiii.ii.iaaa   , aiii.iiii.i aiii.iiai.i aiii.iiai.i i.ii.iaaa i.i'
[i.split('.') for i in x.replace(' ','|').replace('|||','| |').split('|')]

Вывод:

[['?'],
 ['i', 'iaaa', 'iaaa'],
 ['aii', 'aai', 'iaaa'],
 ['ia', 'iiii', 'i'],
 [' '],
 ['aiai', 'aii', 'iaaa'],
 ['aii', 'iiii', 'i'],
 [' '],
 ['aiai', 'iaaa', 'i'],
 ['i', 'i'],
 ['aii', 'iiii', 'i'],
 ['ia', 'aai', 'i'],
 [' '],
 ['aii', 'iiii', 'i'],
 ['aii', 'aai', 'iaaa'],
 ['aiii', 'ii', 'iaaa'],
 [' '],
 [','],
 ['aiii', 'iiii', 'i'],
 ['aiii', 'iiai', 'i'],
 ['aiii', 'iiai', 'i'],
 ['i', 'ii', 'iaaa'],
 ['i', 'i']]
0 голосов
/ 23 марта 2020

Вы пробовали с помощью регулярных выражений?

import re
def main():
    test = "? i.iaaa.iaaa aii.aai.iaaa ia.iiii.i aiai.aii.iaaa aii.iiii.i aiai.iaaa.i i.i aii.iiii.i ia.aai.i aii.iiii.i aii.aai.iaaa aiii.ii.iaaa , aiii.iiii.i aiii.iiai.i aiii.iiai.i i.ii.iaaa i.i"
    rgx = r"^(\?)|(?:i|a)+|(\s+)"
    result = re.finditer(rgx, test, re.MULTILINE)

    for matchNum, match in enumerate(result, start=1):
        print("["+str(matchNum)+"] = " + match.group() + ",")
main()

Тогда результат:

[1] = ?, [2] =  , [3] = i, [4] = iaaa, [5] = iaaa, [6] =  , [7] = aii, [8] = aai, [9] = iaaa, [10] =  , [11] = ia, [12] = iiii, [13] = i, [14] =  , [15] = aiai, [16] = aii, [17] = iaaa, [18] =  , [19] = aii, [20] = iiii, [21] = i, [22] =  , [23] = aiai, [24] = iaaa, [25] = i, [26] =  , [27] = i, [28] = i, [29] =  , [30] = aii, [31] = iiii, [32] = i, [33] =  , [34] = ia, [35] = aai, [36] = i, [37] =  , [38] = aii, [39] = iiii, [40] = i, [41] =  , [42] = aii, [43] = aai, [44] = iaaa, [45] =  , [46] = aiii, [47] = ii, [48] = iaaa, [49] =  , [50] =  , [51] = aiii, [52] = iiii, [53] = i, [54] =  , [55] = aiii, [56] = iiai, [57] = i, [58] =  , [59] = aiii, [60] = iiai, [61] = i, [62] =  , [63] = i, [64] = ii, [65] = iaaa, [66] =  , [67] = i, [68] = i

Вы также можете использовать этот инструмент regex101 для построения регулярное выражение, как вам нужно.

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