需要从python list comprehension中提取多个值吗?

时间:2018-04-23 02:42:28

标签: python python-2.7 list list-comprehension

我有一个包含元组键的字典,如下所示:

(1111, 3454): 34.55555
(1123, 4665): 67.12
(1111, 9797): 5.09

我需要做一个列表理解,它会抓住具有匹配的第一个元素的所有条目的值。 问题是,我还需要元组的第二个值......

interimlist = [v for k,v in mydict.items() if k[0]==item[0]]

如果元组的第一个元素是正确的(item是迭代器变量),那么我现在就可以获取值。我希望输出是(值,第二元组编号)的元组列表,所以对于示例点,如果item [0]是1111,则将是以下输出:

[(34.55555, 3454), (5.09, 9797)]

1 个答案:

答案 0 :(得分:1)

这里的dict没有以良好的结构存储。必须迭代所有键/​​ val才能进行一次查找,因此它是O(n)检索。

您应该对数据进行一次性重新键入,在dict中添加另一级别的嵌套:

>>> d
{(1111, 3454): 34.55555, (1123, 4665): 67.12, (1111, 9797): 5.09}
>>> d_new = {}
>>> for (k1, k2), v in d.items():
...     if k1 not in d_new:
...         d_new[k1] = {}
...     d_new[k1][k2] = v

现在,O(1)查找已恢复:

>>> d_new[1111]
{3454: 34.55555, 9797: 5.09}
>>> [item[::-1] for item in d_new[1111].items()]
[(34.55555, 3454), (5.09, 9797)]