使用字典的python3列表理解并不总是返回相同的列表

时间:2017-12-20 11:33:30

标签: python python-3.x list-comprehension

编辑: 根据要求,这是我要解决的问题: 我有一个目录中没有扩展名的文件。基于"文件的输出"命令我想分配相应的扩展名。所以我的字典是将这个输出中的字符串分配给扩展名(例如" 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")?

2 个答案:

答案 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])