首页 > 解决方案 > 如何根据字符串的三进制值将列表中的位置分配给字符串?

问题描述

我正在编写一个程序来构造一个有向图,其节点将是 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', value = ['QWE','QWQ','QWW'] 对所有 27 个组合重复),我必须硬编码。

我将如何使用三进制数字系统的想法来完成这项任务,而不仅仅是我编码:'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" 

谢谢!

标签: pythongraph-theorycombinatorics

解决方案


最后一个位置是值得的1*char_value,其中 char_value 对于 Q 为 0,对于 W 为 1,对于 E 为 2。中间位置是值得3*char_value和第一个9*char_value。一般来说,从右边算起的位置在3**i * char_value哪里(是 3 的 i 次方)。i3**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

推荐阅读