python – 如何优雅地替换字符串中的每个元素(字符)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何优雅地替换字符串中的每个元素(字符)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3215字,纯文字阅读大概需要5分钟。
内容图文
这是两个字符串:
d = '123'
list1 = '12345'
显然,d中包含三个元素,分别是’1′,’2′,’3′.
现在,尝试使用list1中的元素替换这三个元素.并打印每个可能的组合.
因此,我们可以将’1’替换为’1′,’2′,’3′,’4′,’5′,或者不要忘记我们需要为’2’和’3做同样的事情’在d.
然后结果看起来像:
'111', '112', '113', '114', '115'
'121', '122', '123', '124', '125'
...
...
...
'541', '542', '543', '544', '545'
'551', '552', '553', '554', '555'
非常感谢@tobais_k提醒,这个问题可以被描述为“输入中的相等字符被映射到输出中的相等字符”.
因此,如果我们有d1 =’111222333′,那么输出就是
'111111111', '111111222', '111111333', '111111444', '111111555',
'111222111', '111222222', ...,
'555555111', '555555222', '555555333', '555555444', '555555555'
如果d2 =’123123123′,情况将与d1非常不同,因为我们无法从d2获得’111111222′.结果将是:
'111111111', '112112112', '113113113', '114114114', '115115115',
'121121121', '122122122', '123123123', '124124124', '125125125',
...
'551551551', '552552552', '553553553', '554554554', '555555555'
这是我的代码给出上面的结果:
d = '123'
list1 = '12345'
list2 = sorted(set(d))
# make a dict to recognize the position of each element
position = {}
for i in list2:
position[i] = []
for (x,y) in enumerate(d):
if y==i:
position[i].append(x)
print(position)
# in this case,it should return{'1': [0], '2': [1], '3': [2]}
for i1 in list1:
for i2 in list1:
for i3 in list1:
c = list(d)
# because we know the exact position for each element
# then we make a new list every time
# just replace the right element at the right place
f = [i1, i2, i3]
j = 0
for (k,v) in position.items():
for x in v:
c[x]=f[j]
j += 1
print(''.join(y for y in c))
您可能希望尝试d =’123123123’或d =’111222333’无论如何,检查结果,但请注意它们是代码中的几个嵌入式“for”并使此代码不那么Pythonic.
有没有更优雅的方式来给出相同的结果?
我的代码看起来有点尴尬,毫无疑问我可以从你身上学到更多东西;那么,这种技能在其他情况下会有所帮助,例如:我们有一个复杂的encryptedD =’bccle’,key =’ap’;通过这个简单的程序后,我们可能会发现D实际上意味着’苹果’.
解决方法:
您可以使用itertools.product获取所有组合,并将这些组合与str.maketrans和str.translate组合以将原始字符映射到其替换项.
>>> d = "121"
>>> list1 = 'abc'
>>> chars = list(set(d))
>>> [d.translate(str.maketrans(dict(zip(chars, prod))))
... for prod in itertools.product(list1, repeat=len(chars))]
['aaa', 'aba', 'aca', 'bab', 'bbb', 'bcb', 'cac', 'cbc', 'ccc']
让我们看一下中间结果,以便更好地了解正在发生的事情:
>>> [prod for prod in itertools.product(list1, repeat=len(chars))]
[('a', 'a'), ('a', 'b'),... , ('c', 'c')]
>>> [dict(zip(chars, prod)) for prod in itertools.product(list1, repeat=len(chars))]
[{'2': 'a', '1': 'a'}, {'2': 'b', '1': 'a'},... , {'2': 'c', '1': 'c'}]
>>> [str.maketrans(dict(zip(chars, prod))) for prod in itertools.product(list1, repeat=len(chars))]
[{49: 'a', 50: 'a'}, {49: 'a', 50: 'b'},... , {49: 'c', 50: 'c'}]
或作为生成器功能(基于@AntonvBR的第一版)
def func(values, order):
""" Returns the combinations of values defined by the set
of the order translated back to the length of the order.
>>> list(func(values='ab', order='1212'))
['aaaa', 'baba', 'abab', 'bbbb']
"""
s = list(set(order))
for prod in itertools.product(values, repeat=len(s)):
d = dict(zip(s, prod))
yield order.translate(str.maketrans(d))
内容总结
以上是互联网集市为您收集整理的python – 如何优雅地替换字符串中的每个元素(字符)?全部内容,希望文章能够帮你解决python – 如何优雅地替换字符串中的每个元素(字符)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。