我正在为性能很重要的应用程序编写代码.我想知道为什么defaultdict似乎更快setdefault.
我希望能够使用setdefault,主要是因为我不喜欢嵌套的打印输出defaultdict(参见下面的实现).
在我的代码中,我需要测试是否element_id已经是dict的关键.
以下是我正在测试的两个函数:
def defaultdictfunc(subcases,other_ids,element_ids):
dict_name= defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
for subcase in subcases:
for other_id in other_ids:
for element_id in element_ids:
if element_id in dict_name[subcase][other_id]:
# error duplicate element_id
pass
else:
dict_name[subcase][other_id][element_id]=0
return dict_name
def setdefaultfunc(subcases,other_ids,element_ids):
dict_name={}
for subcase in subcases:
for other_id in other_ids:
for element_id in element_ids:
if element_id in dict_name.setdefault(subcase,{}).setdefault(other_id,{}):
# error duplicate element_id
pass
else:
dict_name[subcase][other_id][element_id]=0
return dict_name
Run Code Online (Sandbox Code Playgroud)
IPython输入输出:
In [1]: from numpy.random import randint …Run Code Online (Sandbox Code Playgroud) 我有以下自定义类:
class MyArray (OrderedDict):
def __init__ (self,*args):
OrderedDict.__init__(self,*args)
def __getitem__ (self, key):
if not hasattr (key, '__iter__'):
return OrderedDict.__getitem__ (self,key)
return MyArray((k,self[k]) for k in key)
Run Code Online (Sandbox Code Playgroud)
当我有多个键时,这个类完全符合我的要求,但是没有按照我想要的单键操作.
让我演示一下我的代码输出的内容:
x = MyArray()
x[0] = 3
x[1] = 4
x[2] = 5
print x[1,0,2]
MyArray([(1,4),(0,3),(2,5)])
Run Code Online (Sandbox Code Playgroud)
但是之后:
print x[1]
4
Run Code Online (Sandbox Code Playgroud)
我希望它是:
MyArray([(1,4)])
Run Code Online (Sandbox Code Playgroud)
这是我尝试修复它以我想要的方式行动(导致无限递归):
class MyArray (OrderedDict):
def __getitem__ (self, key):
if not hasattr (key, '__iter__'):
return MyArray({key:OrderedDict.__getitem__ (self,key)})
return MyArray((k,OrderedDict.__getitem__ (self,k)) for k in key)
Run Code Online (Sandbox Code Playgroud) 我的命名元组定义如下:
In[37]: from collections import namedtuple
Point = namedtuple('Point', 'x y')
Run Code Online (Sandbox Code Playgroud)
嵌套字典具有以下格式:
In[38]: d
Out[38]:
{1: {None: {1: Point(x=1.0, y=5.0), 2: Point(x=4.0, y=8.0)}},
2: {None: {1: Point(x=45324.0, y=24338.0), 2: Point(x=45.0, y=38.0)}}}
Run Code Online (Sandbox Code Playgroud)
我正在尝试从字典 d 创建一个 pandas 数据框,而不必执行 for 循环。
我通过执行以下操作成功地从字典的子集创建了数据框:
In[40]: df=pd.DataFrame(d[1][None].values())
In[41]: df
Out[41]:
x y
0 1 5
1 4 8
Run Code Online (Sandbox Code Playgroud)
但我希望能够从整个字典创建数据框。
我希望数据帧输出以下内容(我使用多索引表示法):
In[42]: df
Out[42]:
Subcase Step ID x y
1 None 1 1.0 5.0
2 4.0 8.0
2 None 1 45324.0 24338.0
2 45.0 38.0
Run Code Online (Sandbox Code Playgroud)
DataFrame的from_dict方法最多只支持两层嵌套,所以我无法使用它。我也在考虑修改d字典的结构来实现我的目标。此外,也许它不一定是一本字典。
谢谢。
我有以下numpy结构化数组:
x = np.array([(22, 2, -1000000000.0, [1000,2000.0]), (22, 2, 400.0, [1000,2000.0])],
dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4',2)])
Run Code Online (Sandbox Code Playgroud)
如您所见,字段'f4'是一个矩阵:
In [63]: x['f4']
Out[63]:
array([[ 1000., 2000.],
[ 1000., 2000.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
我的最终目标是拥有一个只有矢量的numpy结构化数组.我想知道如何将'f4'分成两个字段('f41'和'f42'),其中每个字段代表矩阵的列.
In [67]: x
Out[67]:
array([(22, 2, -1000000000.0, 1000.0, 2000.0),
(22, 2, 400.0, 1000.0, 2000.0)],
dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f41', '<f4'), ('f42', '<f4')])
Run Code Online (Sandbox Code Playgroud)
此外,我想知道是否有可能在使用修改数组的操作或最小化原始数据的复制时实现这一点.
我希望能在手机上安装2个版本的应用程序.在App Store上发布的那个,以及我用来通过xcode在我的iphone上测试的那个.不幸的是,当我使用xcode在我的iphone上运行我的应用程序时,它取代了我从应用程序商店下载的应用程序.
这两个版本都可以吗?
python ×4
dictionary ×3
app-store ×1
dataframe ×1
defaultdict ×1
download ×1
ios ×1
iphone ×1
namedtuple ×1
numpy ×1
pandas ×1
setdefault ×1
xcode ×1