找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 492|回复: 7

[代码与实例] 字符串替换

1

主题

3

帖子

3

积分

贫民

积分
3
cauchy_dxm 发表于 2017-7-17 14:19:26 | 显示全部楼层 |阅读模式
社区大神们,求帮忙。问题:字符串“12345”中1可能被念成E,2可能被念成R,5可能被识别成U。想输出字符串的所有可能组合。

比如就上面的字符串“12345”1有两种可能1和E,2有两种可能2和R,5有两种可能5和U。此字符串就有2*2*2=8中可能组合{12345,E2345, 1R345, ER345, 1234U, E234U,1R34U, ER34U}

怎么用python实现可能组合的输出?感谢大神们。
回复

使用道具 举报

0

主题

4

帖子

4

积分

贫民

积分
4
hxz19950318 发表于 2017-7-17 17:24:27 | 显示全部楼层
import random
test='12345'
list=['1','2','5']
L=[]
dict={'1':['1','e'],'2':['2','r'],'5':['5','u']}
for i in test:
        if i in list:
                j=random.randint(0,1)
                L.append(dict[i][j])
        else:
                L.append(i)
print "%s%s%s%s%s" %tuple(L)

我不知道写的算不算规范,不过能用
回复 支持 反对

使用道具 举报

1

主题

28

帖子

28

积分

贫民

积分
28
cdbclx 发表于 2017-7-18 06:53:26 | 显示全部楼层
本帖最后由 cdbclx 于 2017-7-18 07:01 编辑

如果确定最多只有两种变化,就可以简单些,考虑到可能有更多变化,所以写的复杂了点:

import copy
L=[]
str='12345'
dd={'1':('1','E'),'2':('2','R'),'5':('5','U')}
a=[]
for i in str:
    if i in dd:
        a.append(dd)
    else:
        a.append((i,))

for i in a:
    l=len(i)
    ll=len(L)
    if l>1:
        if ll==0:
            for ii in i:
                L.append([ii])
            
        else:
            for xx in range(l-1):
                for LL in range(ll):
                    L.append(copy.deepcopy(L[LL]))
            for ii in range(l):
               
                for LL in range(ll):
                    L[ii*ll+LL].append(i[ii])
                  
    else:
        if ll==0:
            L.append(i[0])
        else:
            for xxx in range(ll):
                L[xxx].append(i[0])

for i in L:
    print ''.join(i)
   
运行结果:
12345
E2345
1R345
ER345
1234U
E234U
1R34U
ER34U
>>>


回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
cauchy_dxm  楼主| 发表于 2017-7-18 16:06:07 | 显示全部楼层
hxz19950318 发表于 2017-7-17 17:24
import random
test='12345'
list=['1','2','5']

谢谢您的帮助,看您代码只能随机输出一个。需求是所有可能情况都要输出。可能我叙述的不清楚。再次谢谢您。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

3

积分

贫民

积分
3
cauchy_dxm  楼主| 发表于 2017-7-18 16:09:30 | 显示全部楼层
cdbclx 发表于 2017-7-18 06:53
如果确定最多只有两种变化,就可以简单些,考虑到可能有更多变化,所以写的复杂了点:

import copy

首先谢谢您的帮助。我运行了下,有一行错误。
Traceback (most recent call last):
  File "e:\cauchy\Python\Code\test.py", line 34, in <module>
    L[xxx].append(i[0])
AttributeError: 'str' object has no attribute 'append'。
有空帮忙再看看。谢谢!
回复 支持 反对

使用道具 举报

1

主题

28

帖子

28

积分

贫民

积分
28
cdbclx 发表于 2017-7-18 22:09:02 | 显示全部楼层
本帖最后由 cdbclx 于 2017-7-18 22:11 编辑

不好意思,有个bug,
报错那一行的上面第三行,改成 L.append([i[0]])   少了个方括号,改之前可以支持你举的例子,但是如果第一个字符没有多个变化的话,就有问题了
回复 支持 反对

使用道具 举报

0

主题

5

帖子

5

积分

贫民

积分
5
艾幻翔 发表于 2017-8-22 17:51:05 | 显示全部楼层
本帖最后由 艾幻翔 于 2017-8-27 17:49 编辑

献丑~
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Created by lightwave on 2017/8/27

  4. from itertools import product

  5. data = [('1', 'E'), ('2', 'R'), ('3',), ('4',), ('5', 'U')]
  6. for i in product(*data):
  7.     print(''.join(i))
复制代码


点评

厉害!  发表于 2017-9-14 14:08
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表