使用键和值列表创建Python字典

3

我有三个列表,每个列表都有x个元素:

stat = ["A","B","C"]
X = [1,2,3]
Y = [10,15,20]

我想将这些列表创建成字典,其中'stat'应该是键,X和Y是存储在每个两个元素的列表中的valuepairs。结果可能如下:

my_dict = {
    "A" : [1,10],
    "B" : [2,15],
    "C" : [3,20]
}

或者甚至可以是一个嵌套字典,这样我就可以用my_dict ["A"] ["X"] 进行索引。

还有其他方法在Python中得到“命名数组”吗?

由于我的第二个问题与第一个问题非常相关,因此我在此添加它,而不是打开一个新问题:

实际上,我非常习惯R的数组。因此我的问题是:Python中是否有类似于命名数组的东西?例如,我有两个列表表示我的列和行名称:

columns = ["A","B","C"], rows = ["row_a","row_b","row_c"]

现在我想从这两个列表中创建一个数组:
my_array = columns x rows

which I want to index with the names like:

my_array["A","row_b"]

在循环中为“单元格”(填充数组)分配值。在Python中是否有一种简单的方法可以实现这样的操作?可能最好使用字典来使用字符串索引..

如果您来自R,并且想要这样的功能,您应该看一下numpy和scipy。 - Björn Pollex
@Björn Pollex 你说得对...在阅读了一些关于numpy的文章之后,结构化/记录数组似乎是我目前需求的一个非常好的替代方案。不过我仍然需要更好地理解它们。有没有什么关于numpy的好书可以推荐? - Johannes
抱歉,我从文档中得到了所有信息。虽然不是完美的,但是和stackoverflow一起使用,你应该能够找到答案 :) - Björn Pollex
3个回答

7
>>> stat = ["A","B","C"]
>>> X = [1,2,3]
>>> Y = [10,15,20]
>>> dict(zip(stat, map(list, zip(X, Y))))
{'A': [1, 10], 'C': [3, 20], 'B': [2, 15]}

我喜欢使用zip的方式,不过目前它还不支持使用两个字符串索引,例如my_dict['A']['X']。 - Johannes
这对我也起作用。这有助于我将字典对象的列表项与映射组合。 - fth

3
>>> stat = ["A","B","C"]
>>> X = [1,2,3]
>>> Y = [10,15,20]
>>> {s:[x,y] for s,x,y in zip(stat, X, Y)}
{'A': [1, 10], 'C': [3, 20], 'B': [2, 15]}

要使用 my_dict["A"]["X"] 有些不同。
>>> {s:{'X':x, 'Y':y} for s,x,y in zip(stat, X, Y)}
{'A': {'Y': 10, 'X': 1}, 'C': {'Y': 20, 'X': 3}, 'B': {'Y': 15, 'X': 2}}

对于第一种方式,Python3的语法更为优越:

>>> stat = ["A","B","C"]
>>> X = [1,2,3]
>>> Y = [10,15,20]
>>> {k:v for k,*v in zip(stat, X, Y)}
{'A': [1, 10], 'C': [3, 20], 'B': [2, 15]}

这是 Python 3 的特性,不是吗? - Björn Pollex
1
@BjörnPollex,字典推导式在Python2.7+中可用。但是Python3添加了一种很好的方法来解压缩zip。 - John La Rooy

3
生成器表达式是强大的工具:
dict((key, [v1,v2]) for key, v1, v2 in zip(stat, X, Y))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接