警告:这个问题不是您的想法!
假设我有一个像这样的字符串(Python):
'[[1, 2], [2, 3], [0, 3]]'
现在进一步假设我有个字符的置换0
,1
,2
,3
,它们交换了{{1} }和0
以及(单独)1
和2
。那我想获得
3
从这里。作为另一个示例,假设我想使用更复杂的置换,其中'[[0, 3], [3, 2], [1, 2]]'
进入1
,2
进入2
,而3
进入{{ 1}}?然后我希望输出
3
问题:鉴于字符/整数1
到 '[[2, 3], [3, 1], [0, 1]]'
的排列(包含编码,但有人喜欢)和包含(其中一些)字符/整数的字符串,我想该函数采用这样的字符串,并在其中已替换了这些字符/整数的情况下给出适当的结果字符串-没什么。
我很难看清0
是否有明显用途,甚至只是索引编制对我有帮助,因为通常这些替换是连续的,在这种情况下显然是不好的。任何帮助将不胜感激,即使它使我看起来很笨。
(如果有人对原始列表n-1
有想法,那也很好,但是那是列表列表,可能比字符串还烦人,字符串就我而言就足够了。)< / p>
答案 0 :(得分:2)
这是使用带回调的正则表达式的简单解决方案:
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 :(得分:1)
好吧,我认为通常您需要使用结果的工作内存副本来避免您提到的顺序问题。另外,转换为某种结构化数据格式(如数组)可以使事情变得更加容易(您不必这么说,但是您的目标字符串显然是一个字符串化的数组,因此我认为这是理所当然的)。这是一个使用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]]
答案 2 :(得分:1)
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)
?
答案 3 :(得分:1)
您可以构建所需转换的映射:
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]]
答案 4 :(得分:0)
对于我承认的这个论坛的质量,这绝对是微不足道的,但这是我的建议,仅供参考:
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]]