gpt4 book ai didi

python - 转置字典(从字典列表中提取一个键的所有值)

转载 作者:太空狗 更新时间:2023-10-29 21:58:52 27 4
gpt4 key购买 nike

我有一个这样的字典列表:

 data = [{'x': 1, 'y': 10},
{'x': 3, 'y': 15},
{'x': 2, 'y': 1},
... ]

我有一个函数(例如 matplotlib.axis.plot)需要 xy 值的列表。所以我必须“转置”字典。

第一个问题:这个操作叫什么? “转置”是正确的术语吗?

我试过了,但我正在寻找一种有效的方法(也许有一些特殊的 numpy 函数):

x = range(100)
y = reversed(range(100))
d = [dict((('x',xx), ('y', yy))) for (xx, yy) in zip(x,y)]
# d is [{'y': 99, 'x': 0}, {'y': 98, 'x': 1}, ... ]

timeit.Timer("[dd['x'] for dd in d]", "from __main__ import d").timeit()
# 6.803985118865967

from operator import itemgetter
timeit.Timer("map(itemgetter('x'), d)", "from __main__ import d, itemgetter").timeit()
# 7.322326898574829

timeit.Timer("map(f, d)", "from __main__ import d, itemgetter; f=itemgetter('x')").timeit()
# 7.098556041717529

# quite dangerous
timeit.Timer("[dd.values()[1] for dd in d]", "from __main__ import d").timeit()
# 19.358459949493408

有更好的解决方案吗?我的疑问是:在这些情况下,字符串 'x' 的哈希值每次都会重新计算吗?

最佳答案

从这个 answer 窃取表格

import timeit
from operator import itemgetter
from itertools import imap

x = range(100)
y = reversed(range(100))
d = [dict((('x',xx), ('y', yy))) for (xx, yy) in zip(x,y)]
# d is [{'y': 99, 'x': 0}, {'y': 98, 'x': 1}, ... ]
D={x:y for x,y in zip(range(10),reversed(range(10)))}


def test_list_comp(d):
return [dd['x'] for dd in d]

def test_list_comp_v2(d):
return [(x["x"], x["y"]) for x in d]

def testD_keys_values(d):
return d.keys()

def test_map(d):
return map(itemgetter('x'), d)

def test_positional(d):
return [dd.values()[1] for dd in d]

def test_lambda(d):
return list(imap(lambda x: x['x'], d))

def test_imap_iter(d):
return list(imap(itemgetter('x'), d))

for test in sorted(globals()):
if test.startswith("test_"):
print "%30s : %s" % (test, timeit.Timer("f(d)",
"from __main__ import %s as f, d" % test).timeit())
for test in sorted(globals()):
if test.startswith("testD_"):
print "%30s : %s" % (test, timeit.Timer("f(D)",
"from __main__ import %s as f, D" % test).timeit())

给出以下结果:

    test_imap_iter : 8.98246016151
test_lambda : 15.028239837
test_list_comp : 5.53205787458
test_list_comp_v2 : 12.1928668102
test_map : 6.38402269826
test_positional : 20.2046790578
testD_keys_values : 0.305969839705

显然,最大的胜利是让您的数据格式更接近您已经需要的格式,但您可能无法控制它。

就名称而言,我会称之为转换。

关于python - 转置字典(从字典列表中提取一个键的所有值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12300912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com