我有一个字母和一个坐标,如下:
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]]
答案 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])