【问题标题】:Python - match dictionary value within string & print key in string orderPython - 匹配字符串中的字典值并按字符串顺序打印键
【发布时间】:2018-05-16 19:25:20
【问题描述】:

我早些时候问过一个与此类似的问题,但我仍然很难弄清楚这一点。我有以下代码:

d = {'k' : '10', 'a' : '20', 'r' : '30', 'p' : '401'}

string = '401203010'

text = ''

for i, j in d.items():
    if j in string:
        text += i

print(text) #prints karp

想要的输出:park

我得到的输出是karp,但是我希望输出在字符串中按值匹配的顺序排列,谢谢!

【问题讨论】:

  • 不保证字典在python中是有序的。您获得的每次迭代中的j 值是10 20 30 40,当连接在一起时对应于k a r p,即为您提供karp

标签: string python-3.x dictionary key


【解决方案1】:

试试这个可以吗?

d = {'k' : '10', 'a' : '20', 'r' : '30', 'p' : '40'}

string = '40203010'

text = ''

keylen = len(''.join(d.keys()))

while len(text) != keylen:
    found_val = 0
    for i, j in d.items():
        jl = len(j)
        if string[:jl] == j:
            text += i
            string = string[jl:]
            found_val += 1
    if found_val == 0:
        break

print(text)

为了清楚起见,这真的不是你想在这里使用的算法。例如,其中一个缺点是,如果不能保证字符串的一部分将在字典值中,那么循环将永远不会结束。我不想花费精神资源来解决这个潜在的陷阱,因为我有一些阅读要做,但也许你可以想办法绕过它。

编辑,没关系,这并不难,但您应该测试各种边缘情况。

【讨论】:

    【解决方案2】:

    您可以先将string 拆分为2 的子字符串,然后在临时字典中切换d 的键值和值,然后添加其中的值:

    d = {'k' : '10', 'a' : '20', 'r' : '30', 'p' : '40'}
    
    string = '40203010'
    
    text = ''
    
    split_string = [string[i:i+2] for i in range(0, len(string), 2)]
    # ['40', '20', '30', '10']
    
    new_dict = dict((y,x) for x,y in d.items())
    # {'30': 'r', '10': 'k', '20': 'a', '40': 'p'}
    
    text = "".join(new_dict[string] for string in split_string)
    
    print(text)
    # park
    

    【讨论】:

    • 谢谢!但并非字符串中的所有数字都是 2 位数长,我已经重新编辑了我的问题
    • 好的,我是根据你提供的答案做出这个回答的。
    • 基本上,根据编辑前提供的问题,这仅适用于 2 位数字
    • 确实如此!对不起,我首先不清楚,感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2020-12-17
    • 2023-04-07
    相关资源
    最近更新 更多