Python循环:处理映射匹配列表的精确方法

时间:2011-12-22 07:12:58

标签: python

一个函数返回两个逻辑映射一对一的列表。假设

name = ["facebook", "twitter", "myspace"]
hits = [4000, 2500, 1800]

因此,facebook的点击量为4000,twitter 2500和myspace 2500。

我想将这两个单独的列表转换为字典列表,如

[
  {name: 'facebook',data: [4000]},
  {name: 'twitter',data: [2500]},
  {name: 'myspace',data: [1800]}
]

我的解决方案这样做是:

data = [
    {"name":l, "data":[v]}
    for idx1, l in enumerate(labels)
    for idx2, v in enumerate(values)
    if idx1 == idx2
    ]

是否有更强大的优雅方式处理逻辑一对一映射,或者我的解决方案是否准确?

3 个答案:

答案 0 :(得分:13)

你可以这样做:

[{"name": n, "data": [h]} for n, h in zip(name, hits)]

虽然这符合您的要求,但这里的数据结构可能比您真正需要的更多。考虑:

>>> dict(zip(name, hits))
{'twitter': 2500, 'myspace': 1800, 'facebook': 4000}

这在更易于访问的数据结构中提供了相同的数据集。

答案 1 :(得分:4)

处理一对一关系的最简单,最快捷的方法是制作两个词典:

>>> name = ["facebook", "twitter", "myspace"]
>>> hits = [4000, 2500, 1800]
>>> name2hits = dict(zip(name, hits))
>>> hit2name = dict(zip(hits, name))

答案 2 :(得分:0)

Efficient bidirectional hash table in Python?

相似但不完全相同

您应该只使用两个词典,并在进行更新时将更新应用于两者。

此外,这里存在逻辑上的不一致:您的函数不是一对一的,或者您不需要将data: [...]保留在列表中,因为只能有一个值。

如果您确实需要将其转换为词典列表,请使用https://stackoverflow.com/a/8600534/711085中指出的zip