我正在努力寻找一些显然真的很容易...... 给出一个简单的字典,其中整数作为键,列表作为值
a = {}
a[0] = ['HI','HOME']
a[1] = ['tree','car', 'food']
print(a)
{0: ['HI', 'HOME'], 1: ['tree', 'car', 'food']}
我想得到一个只有键的列表/ np.array:
[0,0,1,1,1]
我试图寻找地图功能,但我还没找到任何东西...... 感谢
答案 0 :(得分:2)
使用np.repeat
和map(len..)
-
np.repeat(a.keys(), map(len,a.values()))
示例运行 -
In [152]: a
Out[152]: {0: ['HI', 'HOME'], 1: ['tree', 'car', 'food']}
In [153]: np.repeat(a.keys(), map(len,a.values()))
Out[153]: array([0, 0, 1, 1, 1])
或者,我们可以使用列表理解来获取长度。因此,map(len,a.values()
可以替换为 -
[len(i) for i in a.values()]
对于Python 3.x
,我相信,我们需要将list
与map
包裹起来 -
In [39]: np.repeat(list(a.keys()), [len(i) for i in a.values()])
Out[39]: array([0, 0, 1, 1, 1])
答案 1 :(得分:2)
我认为最优化的方式(特别是对于短小型和中型数组)使用嵌套列表理解,如下所示:
In [66]: [key for key, val in a.items() for _ in val]
Out[66]: [0, 0, 1, 1, 1]
以下是其他答案的基准(更快):
In [75]: %timeit np.repeat(list(a.keys()), list(map(len, a.values())))
100000 loops, best of 3: 5.18 us per loop
In [76]: %timeit [key for key, val in a.items() for _ in val]
1000000 loops, best of 3: 558 ns per loop
对于最大的数据集,您应该使用numpy,但在计算键和值的长度时会有一些变化:
a = {i:[3, 4, 5]*1000 for i in range(1000)}
In [86]: %timeit [key for key, val in a.items() for _ in val]
10 loops, best of 3: 54.7 ms per loop
In [87]: %timeit np.repeat(list(a.keys()), list(map(len, a.values())))
100 loops, best of 3: 9.18 ms per loop
In [88]: %timeit np.repeat(list(a), [len(i) for i in a.values()])
100 loops, best of 3: 9.12 ms per loop