在Python中按特定顺序填充带有字典键的列表

时间:2015-04-07 02:28:56

标签: python list dictionary

我有一个字母和一个坐标,如下:

alfacor = {'a': [1, 1], 'c': [1, 3], 'b': [1, 2]...}

然后我有一个下一格式的列表

final_list = [[2, 2], [3, 4], [3, 5], [4, 3], [3, 3], [1, 1], [1, 4], [1, 3], [3, 4]]

最后一个for循环应该可以做到这一点,但显然我错过了一些东西

for l, c in alfacor.iteritems():
    if c in final_list:
        encripta_f.append(l)

输出

['a', 'c', 'd', 'g', 'o', 'n', 'p', 's']

预期输出

[g, o, p, s, n, a, d, c, o]

我看到final_list它已按照以下顺序设置,并且重复的项目也被忽略,有关如何获得预期输出的任何想法

[[1, 1], [1, 3], [1, 4], [2, 2], [3, 4], [3, 3], [3, 5], [4, 3]]

1 个答案:

答案 0 :(得分:2)

Python中的词典没有定义的迭代顺序,无论您是直接迭代键(for key in some_dict:),还是使用items()iteritems()。如果您想按特定顺序迭代字典,则必须自己完成。

在这种情况下,看起来你想要按照它们对应的final_list元素顺序排列的键?如果是这样,您将要迭代final_list,并检查其每个值是否为alfacor中的值,然后输出相应的密钥。

要执行此操作,您必须反转字典。 (如果你在字典中没有任何重复的值,这是安全的,如果你做或不在这里,我无法告诉你。仅供参考。)

为此,您需要在字典中具有可清除的值(基本上,它们必须是不可变的)。元组会做的伎俩,但元组不等于具有相同内容的列表:

>>> [1, 2] == (1, 2)
False

因此,您需要将final_list中的元素转换为元组,以实现相等的工作。

总之,这样的事情应该可以解决问题:

# invert the `alfacor` dict, and conver its
# values to tuples which are hashable
inv_alfacor = {}
for letter, coordinate in alfacor.iteritems():
    inv_alfacor[tuple(coordinate)] = letter

# now build the output list in the order of the
# input list, converting the coordinates from
# final_list to tuples since lists and tuples
# are never equal
encripta_f = []
for element in final_list:
    element = tuple(element)
    if element in inv_alfacor:
        encripta_f.append(inv_alfacor[element])