Как сгруппировать часть чисел в списке вместе Python - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я работаю над программой, в которой я должен взять строку в качестве входных данных, а затем перевернуть все числа в этой строке, оставив все остальные символы такими же. Мне удалось это сделать, однако, похоже, я должен переворачивать части чисел за раз, а не переворачивать все числа. Я не уверен, как я могу сделать это с моим решением. Я бы предпочел не использовать никаких библиотек.

Например:

Для ввода abc123abc456abc7891

Мой результат: abc198abc765abc4321

Целевой результат: abc321abc654abc1987

Вот что у меня есть:

#Fucntion just reverses the numbers that getn gives to it
def reverse(t):
    t = t[::-1]
    return t

def getn(w):
    w = list(w)
    Li = []
#Going through each character of w(the inputted string) and adding any numbers to the list Li
    for i in w:
        if i.isdigit():
            Li.append(i)
#Turn Li back into a string so I can then reverse it using the above function
#after reversing, I turn it back into a list
    Li = ''.join(Li)
    Li = reverse(Li)
    Li = list(Li)
#I use t only for the purpose of the for loop below,
#to get the len of the string,
#a is used to increment the position in Li
    t = ''.join(w)
    a = 0
#This goes through each position of the string again,
#and replaces each of the original numbers with the reversed sequence
    for i in range(0,len(t)):
        if w[i].isdigit():
            w[i] = Li[a]
            a+=1
#Turn w back into a string to print
    w = ''.join(w)
    print('New String:\n'+w)

x = input('Enter String:\n')
getn(x)

Ответы [ 4 ]

2 голосов
/ 13 марта 2019

Это рабочий код, основанный на предложении @ prune .

def type_changed(s1,s2):
    if s1.isdigit() != s2.isdigit():
        return True

def get_subs(s):
    sub_strings = list()
    i = 0
    start = i
    while i < len(s):
        if i == len(s)-1:
            sub_strings.append(s[start:i+1])
            break
        if type_changed(s[i], s[i+1]):
            sub_strings.append(s[start:i+1])
            start = i+1
        i +=1
    return sub_strings

def reverse(subs):
    for i, sub in enumerate(subs):
        if sub.isdigit():
            subs[i] = subs[i][::-1]
    return ''.join(subs)


test_strings = [
    'abc123abc456abc7891b',
    'abc123abc456abc7891',
    'abc123abc456abc7891abc',
    'a1b2c3d4e5f6',
    'a1b2c3d4e5f6g',
    '1234',
    'abcd',
    '1',
    'a'
]

for item in test_strings:
    print(item)
    print(reverse(get_subs(item)))
    print
2 голосов
/ 13 марта 2019

Схема решения:

  • Разбить строку на список подстрок.Каждая подстрока определяется делением между цифрами и не цифрами.Ваш результат в конце этого этапа должен быть ["abc", "123", "abc", "456", "abc", "7891"]
  • Просмотрите этот список;замените каждую строку цифр на обратную.
  • join этот список в одну строку.

Последний шаг - просто ''.join(substring_list).

Средняяшаг содержится в том, что вы уже делаете.

Первый шаг не тривиален, но вполне соответствует способности кодирования в вашем исходном сообщении.

Можете ли вы взять его отсюда?


ОБНОВЛЕНИЕ

Вот логика разбить строку на группы по мере необходимости.Проверьте «цифру» каждого символа.Если он отличается от предыдущего символа, вам нужно начать новую подстроку.

instr = "abc123abc456abc7891"

substr = ""
sub_list = []
prev_digit = instr[0].isdigit()

for char in instr:
    # if the character's digit-ness is different from the last one,
    #    then "tie off" the current substring and start a new one.
    this_digit = char.isdigit()
    if this_digit != prev_digit:
        sub_list.append(substr)
        substr = ""
        prev_digit = this_digit

    substr += char

# Add the last substr to the list
sub_list.append(substr)

print(sub_list)

Вывод:

['abc', '123', 'abc', '456', 'abc', '7891']
2 голосов
/ 13 марта 2019

Следующее не особенно элегантно, но концептуально довольно просто, используя groupby из itertools, чтобы разбить строку на группы цифр или не цифр (это Python 3.7, я думаю, что он должен работатьна любом Python 3.x, но не проверял, кроме как на 3.7):

from itertools import groupby

def getn(s):
    sections = groupby(s, key=lambda char: char.isdigit())
    result = []
    for isdig, chars in sections:
        if isdig:
            result += list(reversed(list(chars)))
        else:
            result += list(chars)
    return "".join(result)

input = "abc123abc456abc7891"
print(getn(input))
1 голос
/ 13 марта 2019

Идея состоит в том, чтобы разделить цифры и буквы на секции подстрок.Итерация по каждому разделу и обратный просмотр только целочисленных разделов.Затем объедините разделы в одну строку.

def getn(w):
   ans = []
   section = ''

   if w[0].isdigit():
       last = 'digit'
   else:
       last = 'letter'

   for char in w:
       if char.isdigit():
           if last == 'letter':
               ans.append(section)
               section = ''
               last = 'digit'
           section += char
       else:
           if last == 'digit':
               ans.append(section)
               section = ''
               last = 'letter'
           section += char
   ans.append(section)

   for index, section in enumerate(ans):
       if section.isdigit():
           ans[index] = section[::-1]
   return ''.join(ans)

string = 'abc123abc456abc7891'
print(getn(string))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...