【发布时间】:2016-06-16 18:26:06
【问题描述】:
我有如下列表的字典(它可以超过1M个元素,也假设字典是按键排序的)
import scipy.sparse as sp
d = {0: [0,1], 1: [1,2,3],
2: [3,4,5], 3: [4,5,6],
4: [5,6,7], 5: [7],
6: [7,8,9]}
我想知道将其转换为行和列索引列表的最有效方法(大型字典的最快方法)是:
r_index = [0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6]
c_index = [0, 1, 1, 2, 3, 3, 4, 5, 4, 5, 6, 5, 6, 7, 7, 7, 8, 9]
以下是我目前的一些解决方案:
-
使用迭代
row_ind = [k for k, v in d.iteritems() for _ in range(len(v))] # or d.items() in Python 3 col_ind = [i for ids in d.values() for i in ids] -
使用熊猫库
import pandas as pd df = pd.DataFrame.from_dict(d, orient='index') df = df.stack().reset_index() row_ind = list(df['level_0']) col_ind = list(df[0]) -
使用迭代工具
import itertools indices = [(x,y) for x, y in itertools.chain.from_iterable([itertools.product((k,), v) for k, v in d.items()])] indices = np.array(indices) row_ind = indices[:, 0] col_ind = indices[:, 1]
如果我的字典中有很多元素,我不确定哪种方法是处理这个问题的最快方法。谢谢!
【问题讨论】:
-
出于好奇,你为什么要这样做?
-
高效在什么方面?代码行?执行时间处理时间?可维护性?访问权限?其他?
-
@nbryans 一个例子是将其转换为稀疏矩阵,即
csr_matrix((data, (row_ind, col_ind))。我还想使用 pandas 将此格式插入到 SQL 表中。普通列表格式将采用更易于使用的格式。 -
@Prune 抱歉,我应该说“最快”的执行方式(执行时间)。效率不高。我马上改标题。
-
那么为什么不自己测量时间并在这里发布呢?该线程可能更适合 stackexchange。
标签: python dictionary itertools