将python字典转换为python列表

时间:2018-07-25 20:45:04

标签: python list dictionary tuples

dictionary = {0:0.2, 9:0.4}

pylist = [0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0.4]

哪种是将字典转换为pylist的有效方法?字典中的键构成列表中的索引,字典中的各个值成为列表中的值。字典中的键范围介于0到9之间(含0和9)。列表的长度将固定为10。

pytuple = [ (0, 0.2), (9,0.4)]

pylist = [0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0.4]

或者,将pytuple转换为pylist的有效方法是什么?元组中的第一个元素形成列表中的索引,元组中的相应第二个值成为列表中的值。字典中的键范围介于0到9之间(含0和9)。列表的长度将固定为10。

1 个答案:

答案 0 :(得分:0)

我做了一些测量,将字典转换为pylist,结果如下:

from timeit import timeit    

dictionary = {0:0.2, 9:0.4}

def method1(d, n=10):
    return [d[i] if i in d.keys() else 0 for i in range(n)]


def method2(d, n=10):
    return [d.get(i, 0) for i in range(n)]


def method3(d, n=10):
    return [d.get(i, v) for i, v in enumerate([0] * n)]


def method4(d, n=10):
    l = [0] * n
    for v, k in dictionary.items():
        l[v] = k
    return l

print(timeit("method1(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method2(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method3(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method4(dictionary)", globals=globals(), number=1_000_000))

输出为:

1.8713272300001336
1.8894721449996723
2.15010558800077
0.5128111490002993

很明显,method4是最快的-首先创建固定的零列表,然后仅迭代需要更改的键。

基于这一事实,将元组转换为列表应遵循类似的模式:创建固定列表,然后遍历pytuple并更改该列表中的值。

编辑:

我也用随机词典做了一些测试:

# creating random dictionary
n = random.randint(1000, 100000)
idx = list(range(n))
dictionary = {}
for i in range(random.randint(100, n)):
    dictionary[random.choice(idx)] = random.random()

print('n =',n)
print('len(dictionary.keys() =', len(dictionary.keys()))

print(timeit(f"method1(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method2(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method3(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method4(dictionary, n={n})", globals=globals(), number=100))

结果:

n = 82981
len(dictionary.keys() = 32083
1.203233296999315
1.1194271739987016
1.3668270919988572
0.2243523440010904