将二进制列表转换为字符列表的最佳方法(两个特殊字符)

时间:2017-04-15 13:21:03

标签: python list dictionary zip

我有一个这样的特殊列表:

[0,0,0,1,0,1,0,1,1,1,0,1]

我希望它映射到char列表,​​如:

['+','+','+','-','+','-','+','-','-','-','+','-']

这是一些代码。它将概率乘以计算联合概率:

def solve_all_asigned(self,joint_s):
    mult_val=1
    for tab in self.tables:
        if tab['decision']:
            continue
        name=tab['name']
        nr=name.replace('.',' ')
        nr_spd=re.split(' ',nr)
        val=''
        check_list=[x in joint_s.keys() for x in nr_spd]
        if False in check_list:
            continue
        val=''.join(map(joint_s.get,nr_spd))
        mult_val=mult_val*tab[val]
    return mult_val

n=22
joint_s2={}
all_combinations=list(itertools.product([0,1],repeat=n))
for binlist in all_combinations:
    for i in range(n):
        joint_s2[nan_set[i]]='+' if binlist[i]=='0' else '-'
    s.append(self.solve_all_asigned(joint_s2))
ss=sum(s)

joint_s:{'AA': 'nan', 'AC': 'nan', 'AB': 'nan', 'AE': 'nan', 'AD': 'nan', 'AF': 'nan', 'A': 'nan', 'C': 'nan', 'B': 'nan', 'E': 'nan', 'D': 'nan', 'G': 'nan', 'F': 'nan', 'I': 'nan', 'H': 'nan', 'K': 'nan', 'J': 'nan', 'M': 'nan', 'L': 'nan', 'O': 'nan', 'N': 'nan', 'Q': 'nan', 'P': '+', 'S': 'nan', 'R': 'nan', 'U': 'nan', 'T': 'nan', 'W': 'nan', 'V': 'nan', 'Y': 'nan', 'X': '+', 'Z': 'nan'}
nan_set:['A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'Q', 'S', 'R', 'U', 'T', 'W', 'V']
tab:{'name': 'A.B', '--': 0.19999999999999996, 'decision': False, '+-': 0.6, '++': 0.4, '-+': 0.8}

我该怎么做?

1 个答案:

答案 0 :(得分:0)

要回答您的原始问题,这是一种有效的方法来映射0和0的列表。 1个整数加号和减号。

binlist = [0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1]
a = ['+-'[u] for u in binlist]
print(a)

<强>输出

['+', '+', '+', '-', '+', '-', '+', '-', '-', '-', '+', '-']

但是,正如我上面所说,这个可能实际上不是你的概率计算所必需的。

以下是您可以对代码进行的其他一些改进。

all_combinations=list(itertools.product([0,1],repeat=n))
for binlist in all_combinations:

浪费了很多的RAM。对于n = 22all_combinations列表包含超过400万个22项元组。迭代product的输出更有效率:

for binlist in itertools.product([0, 1], repeat=n):

在这一行:

joint_s2[nan_set[i]]='+' if binlist[i]=='0' else '-'

您针对字符串 binlist[i]测试'0',但binlist元组包含整数 0和1,而不是字符串,Python不会自动将数字字符串转换为整数,反之亦然。

另一个令人费解的部分是

nr=name.replace('.',' ')
nr_spd=re.split(' ',nr)

为什么要使用正则表达式?为什么不使用内置的str.split方法,例如

nr_spd = name.split('.')

OTOH,如果您的name字段可能被一个或多个空格分隔,并且最多只有一个点,那么您可以

nr_spd = name.replace('.', ' ', 1).split()