Перестановка символов в строке - PullRequest
0 голосов
/ 12 июня 2019

Предупреждение: этот вопрос не , что вы думаете!


Предположим, у меня есть такая строка (Python):

'[[1, 2], [2, 3], [0, 3]]'

Теперь предположим, что у меня есть перестановка символов 0, 1, 2, 3, которая меняет местами 0 и 1, а также (отдельно ) 2 и 3. Тогда я бы хотел получить

'[[0, 3], [3, 2], [1, 2]]'

из этого. В качестве другого примера, предположим, что я хочу использовать более сложную перестановку, где 1 переходит к 2, 2 переходит к 3, а 3 переходит к 1? Тогда я бы хотел получить

 '[[2, 3], [3, 1], [0, 1]]'

Вопрос : Учитывая перестановку (закодированную как угодно) символов / целых чисел 0 до n-1 и строку, содержащую (некоторые из них), я хотел бы функцию, которая принимает такой строка и дает соответствующую результирующую строку, где эти символы / целые числа были переставлены - и ничего больше.

Мне было очень трудно понять, есть ли какое-то очевидное использование re или даже просто индексация, которая поможет мне, потому что обычно эти замены являются последовательными, что, очевидно, было бы плохо в этом случае. Любая помощь будет высоко оценена, даже если она заставит меня выглядеть глупо.

(Если у кого-то есть идея для первоначального списка [[1, 2], [2, 3], [0, 3]], это тоже хорошо, но это список списков и, вероятно, более раздражающий, чем строка, и строка будет достаточной для моих целей.)

Ответы [ 5 ]

2 голосов
/ 12 июня 2019

Вот простое решение с использованием регулярного выражения с обратным вызовом:

import re

s = '[[1, 2], [2, 3], [0, 3]]'

map = [3, 2, 1, 0]

print(re.sub('\d+',                                 # substitute all numbers
             lambda m : str(map[int(m.group(0))]),  # ... with the mapping
             s                                      # ... for string s
            )
)

# output: [[2, 1], [1, 0], [3, 0]]
1 голос
/ 12 июня 2019

Вы можете построить отображение ваших желаемых преобразований:

import ast
d = ast.literal_eval('[[1, 2], [2, 3], [0, 3]]')
m = {1: 2, 2: 3, 3: 1}
new_d = [[m.get(i) if i in m else 
        (lambda x:i if not x else x[0])([a for a, b in m.items() if b == i]) for i in b] for b in d]

Выход:

[[2, 3], [3, 1], [0, 1]]

Для первого желаемого свопа:

m = {0:1, 2:3}
d = ast.literal_eval('[[1, 2], [2, 3], [0, 3]]')
new_d = [[m.get(i) if i in m else 
    (lambda x:i if not x else x[0])([a for a, b in m.items() if b == i]) for i in b] for b in d]

Выход:

[[0, 3], [3, 2], [1, 2]]
1 голос
/ 12 июня 2019
permutation = {'0':'1', '1':'0', '2':'3', '3':'2'}
s = '[[1, 2], [2, 3], [0, 3]]'
rv = ''

for c in s:
   rv += permutation.get(c, c)

print(rv)

?

1 голос
/ 12 июня 2019

Ну, в общем, я думаю, что вам нужно использовать рабочую копию результирующей памяти, чтобы избежать упомянутой вами очередной проблемы. Кроме того, преобразование в какой-либо структурированный формат данных, например, в массив для работы, значительно упрощает задачу (вы этого не говорите, но ваша целевая строка явно является массивом строк, поэтому я принимаю это как должное). Вот одна идея, использующая eval и numpy:

import numpy as np

s =  '[[2, 3], [3, 1], [0, 1]]'
a = np.array(eval(s))
print('before\n', a)
mymap = [1,2,3,0]
a = np.array([mymap[i] for i in a.flatten()]).reshape(a.shape)
print('after\n', a)

Дает:

before
 [[2 3]
 [3 1]
 [0 1]]
after
 [[3 0]
 [0 2]
 [1 2]]
0 голосов
/ 12 июня 2019

Я абсолютно признателен за качество этого форума, но вот мое предложение просто помочь:

string = '[[1, 2], [2, 3], [0, 3]]'
numbers = dict(zero = 0, one = 1, two = 2, three=3, four = 4, five = 5, six=6, seven=7, height=8, nine = 9)
string = string.replace('0', 'one').replace('1', 'zero').replace('2','three').replace('3', 'two')

for x in numbers.keys():
    string = string.replace(x, str(numbers[x]))

[[0, 3], [3, 2], [1, 2]]

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