【发布时间】:2018-04-26 20:39:41
【问题描述】:
我有一个列表l,由长度为 5 的元组组成。前四个条目是字符串,最后一个是整数。
创建此类列表的虚拟函数可能如下所示:
import numpy as np
import uuid
def get_dummy_data(n=10000):
l = []
for i in range(n):
name = np.random.choice(["Cat", "Dog", "Duck"], 1)[0]
c_id = uuid.uuid4().hex
t_id = uuid.uuid4().hex
l.append((c_id, t_id, name, "canFly", 1))
if np.random.random() < 0.8:
l.append((c_id, t_id, name, "isHungry", 0))
return l
现在这个列表l 包含前三个元素相同但后两个元素不同的元组。这通过以 80% 的机会再次附加相同的元组但更改最后两个元素来举例说明。
目标是将这个长度为 5 的元组列表转换为一个字典,其中键是元组的第一个条目 (c_id),值的结构如下 (t_id, (name, {"isHungry": 0})) 或这个:(t_id, (name, {"canFly":1, "isHungry":0}))。
这可以通过以下循环来实现:
res = {}
for y in l:
if y[0] not in res:
res[y[0]] = (y[1], (y[2], {y[3]: y[4]}))
else:
res[y[0]][1][1].update({y[3]: y[4]})
现在的问题是:我可以让它更快吗?列表l 中可能有两个以上具有相同c_id 的元组(与get_dummy_data 函数相反),我们不能假设l 中的任何顺序。
在执行显式 for 循环来填充 dict 时,我总是有一种不好的感觉,所以我敢打赌,有一个好方法可以让这更快。
【问题讨论】:
-
“在执行显式 for 循环来填充字典时,我总是有一种不好的感觉”而不是......?无论如何,您实际上是否遇到了性能问题?这几乎是即时运行的,比
get_dummy_data函数快。 -
没有关于您的目标和背景或您的背景的更多信息。除了 juanpa 提供的东西之外,很难优化任何东西
-
@juanpa.arrivillaga 在这种特殊情况下,我只是想知道是否有比我更快的解决方案。所以让我们称之为“学术兴趣”
标签: python python-3.x