2

如果我有一个要从中创建字典的大列表,假设我只想这样分配值,那么最有效的方法是什么:

{'item1':'0','item2':'1','item3':'2','itemn':'n-1'}

我在这里看到了很多关于只是为所有键分配相同的值,但没有关于如何根据需要分配值。

谢谢。

编辑:我想这样做的原因是因为我收到了某人的代码是残暴的......(无论如何我不是一个熟练的程序员),我们有一个由 ID 表示的对象列表号码:5432、8976 等

有几百个。好吧,而不是像原始代码那样,将列表视为一个数组,然后找到它range(len(my_list))来为每个对象获取一个指示值,我认为最好只创建一个带有键/值的字典,声明一次然后稍后再引用它,而不是调用数组或 - 在这种情况下 - 每次都重新创建数组。这是一个合理的想法吗?我不知道,但我想试试。

4

6 回答 6

2

试试这个命令:

d = dict(zip(your_list, range(len(your_list)))
于 2013-07-18T22:46:39.000 回答
1
dict(x[i:i+2] for i in range(0, len(x), 2))
于 2013-07-18T22:45:39.243 回答
1
{item: str(i) for i, item in enumerate(my_list)}
于 2013-07-18T23:09:56.377 回答
1

答案似乎取决于您使用的 Python 版本。

这些是我在 Python 2.7.3 上使用 IPython 0.13 的结果:

In [11]: mylist = ["item{}".format(i) for i in range(10**7)]

In [12]: %timeit d = dict(zip(mylist, range(len(mylist))))
1 loops, best of 3: 6.97 s per loop

In [13]: %timeit d = {item: i for i, item in enumerate(mylist)}
1 loops, best of 3: 3.68 s per loop

In [14]: # Edit: xrange is faster than range in Python 2    

In [15]: %timeit d = dict(zip(mylist, xrange(len(mylist))))
1 loops, best of 3: 5.58 s per loop

这就是我在 Python 3.3.2 上使用 IPython 0.13 得到的:

In [5]: mylist = ["item{}".format(i) for i in range(10**7)]

In [6]: %timeit d = dict(zip(mylist, range(len(mylist))))
1 loops, best of 3: 2.62 s per loop

In [7]: %timeit d = {item: i for i, item in enumerate(mylist)}
1 loops, best of 3: 2.92 s per loop

这可能是因为zip在 Python 3 中不返回列表,而只返回一个迭代器……</p>

于 2013-07-18T23:11:12.067 回答
0
dict(("item%d"%i,val) for i,val in enumerate(my_list,1)) 

想必

于 2013-07-18T22:46:42.187 回答
0

如果您现在不关心分配的值,从列表构建 dict 的最快方法是dict.fromkeys(mylist)

In [13]: mylist = ["stuff", "more stuff"]

In [14]: dict.fromkeys(mylist)
Out[14]: {'more stuff': None, 'stuff': None}
于 2013-07-18T23:15:14.287 回答