编辑: 根据要求,这是我要解决的问题: 我有一个目录中没有扩展名的文件。基于"文件的输出"命令我想分配相应的扩展名。所以我的字典是将这个输出中的字符串分配给扩展名(例如" ASCII":" txt")但是不知道它是否是确切的输出。例如:
$ file my_file
myfile: ASCII text
# I want to change the extension of myfile to myfile.txt
这就是我编写的代码所要做的,但也许有更好的解决方案
我有一个字符串的字典,其中的键具有共同的字符串:
MY_D = {
"first_k": "first_v",
"sec_k": "sec_v",
"some_key_name_that_includes_others": "value1",
"some_other_key": "value2",
...
"last_k": "last_v"
}
有时,如果搜索字在键内,我必须获取一个值。我使用这段代码:
key_I_am_looking_for = "some"
value = list(v for k, v in MY_D.items() if value_I_am_looking_for in k)[-1]
但是当我要找的键出现在多个可能的键中时,我得到的值并不总是相同的,在这个例子中它可以是" value1"或" value2"。 我注意到返回的列表并不总是以相同的方式排序。
有没有办法可以让这个返回总是与匹配的最长键对应的值(这里是" value1")?
答案 0 :(得分:0)
Dicts,直到Python 3.7,按规范无序,这意味着代码不应该依赖于字典的内部订单。
解决这个问题的方法只是对dict交互的输出进行排序。在您的代码段中,只需通过调用list
将呼叫更改为sorted
即可完成此操作:
value = sorted(v for k, v in MY_D.items() if value_I_am_looking_for in k)[-1]
答案 1 :(得分:0)
所有比赛中最长的钥匙。用lambda排序可能有所帮助。
这将获得列表列表中的每个匹配项,并使用sorted和key = lambda ...对每个列表中第一项的长度(即保存的键名称)。它将最短的密钥名称排序为最长。获取该列表的最后一个列表和最后一项以获取value1的值。
MY_D = {
"first_k": "first_v",
"sec_k": "sec_v",
"some_key_name_that_includes_others": "value1",
"some_other_key": "value2",
"last_k": "last_v"
}
key_I_am_looking_for = "some"
# List of lists of matches.
value = list([k, v] for k, v in MY_D.items() if key_I_am_looking_for in k)
# Sort by index 0 of each inner list.
key_len = sorted(value, key=lambda l: len(l[0]))
# Last list is longest index 0 so get last item of that list.
print('longest:', key_len[-1][-1])