如何根据字符串的三进制值将列表中的位置分配给字符串?

时间:2019-07-12 22:01:29

标签: python graph-theory combinatorics

我正在编写一个程序,以构造一个有向图,其节点将是3个字母的字符串,这些字符串是字母“ Q”,“ W”和“ E”的所有可能组合的集合的元素'(例如,一个节点将包含“ WEW”,另一个节点将包含“ EWW”)。

每个组合将仅代表一次,总共27个节点。每个节点将具有3条边线,将其连接到其他三种组合,可以通过从右侧推入“ Q”,“ W”或“ E”并弹出最左边的字母(例如,“ QQW”会将边缘指向“ QWQ”,“ QWW”和“ QWE”)。

为了实现这一点,我想到了使用Python字典的想法,并且认为决定哪个字符串与哪个节点一起使用的聪明方法是使用三进制数系统,其中'Q'= 0,'W'= 1 ,并且'E'=2。这样,对节点进行了逻辑排序,我可以使用循环来进行分配,而不必将程序基于庞大的81元素字典(例如,key =' QQW”,值= [27个组合都重复的['QWE','QWQ','QWW']我必须进行硬编码。

我将如何使用三进制数系统的思想来完成此任务,而不仅仅是我编码为:'QQQ'= 0,'QQW'= 1,'QQE'= 2,等等。?换句话说,我如何告诉程序'Q'= 0,'W'= 1,'E'= 2,以便在for循环中我可以说简单的话:

for i in 0:26
list[i] = "appropriate string corresponding to the trinary value of i" 

谢谢!

1 个答案:

答案 0 :(得分:2)

最后一个位置值得1*char_value,其中Q的char_value为0,W的char_value为1,E的char_value为2。中间位置的价值为3*char_value和第一个9*char_value。通常,3**i * char_value其中i是从右边开始计数的位置(3**i是3乘以i的幂)。

def triple_value(triple):
    char_value = {
        'Q': 0,
        'W': 1,
        'E': 2}

    return sum(3**i * char_value[c]
               for i, c in enumerate(reversed(triple)))

for t in ['QQQ', 'QQW', 'EEW', 'EEE']:
    print(t, triple_value(t))

QQQ 0
QQW 1
EEW 25
EEE 26
相关问题