[英]Dictionary Comprehension with multiple statements
我将如何使用字典理解来简化它? 我正在编写一个基本脚本来生产水晶超级单体。 欢迎任何批评,因为我是一名化学家和一个相当糟糕的编码员。 prim_cell 是一个用户定义的字典,格式如下:
for i in range(len(L_XYZ)):
if Atoms == {}:
Atoms.update({i: L_XYZ[i]})
else:
Atoms.update({max(Atoms, key=int)+1: L_XYZ[i]})
对于上下文,Atoms 字典最初是空的
X = 2
Y = 2
Z = 2
prim_cell = {
1 : [ 'Pb', (0.000, 0.000, 0.000) ], 2 : [ 'Pb', (0.500, 0.500, 0.500) ],
3 : [ 'O', (0.305, 0.305, 0.000) ], 4 : [ 'O', (-0.305, -0.305, 0.000) ],
5 : [ 'O', (0.195, 0.805, 0.500) ], 6 : [ 'O', (0.805, 0.195, 0.500) ] }
Atoms = {}
Layers = {}
def Expand(prim_cell,Atoms,prim):
Atom = [ prim[1][0]/X, prim[1][1]/Y, prim[1][2]/Z ]
L_X = [ [ Atom[0] + i/X, Atom[1], Atom[2] ] for i in range(X) ]
L_XY = [ [ Coord[0], Coord[1] + i/Y, Coord[2] ] for Coord in L_X for i in range(Y) ]
L_XYZ = [ [ prim[0], round(Coord[0],9), round(Coord[1],9), round(Coord[2] +i/Z, 9) ] for Coord in L_XY for i in range(Z) ]
for i in range(len(L_XYZ)):
if Atoms == { }:
Atoms.update( { i : L_XYZ[i] } )
else:
Atoms.update( { max( Atoms, key=int ) + 1 : L_XYZ[i] } )
return Atoms
def Supercell(prim_cell,Atoms):
for i in range(len(prim_cell)):
Atoms = Expand(prim_cell,Atoms,prim_cell[i+1])
Layered_Atoms = sorted(Atoms.items(), key = lambda x: x[1][3])
for i in range(len(Layered_Atoms)):
Layers.update( { i + 1 : Layered_Atoms[i][1] } )
for key, value in Layers.items():
print(key,value)
Supercell(prim_cell,Atoms)
这是 output 的示例。 它基本上是 xy 和 z 中每个点的笛卡尔扩展,具体取决于 XY 和 Z 的值
1 ['Pb', 0.0, 0.0, 0.0]
2 ['O', 0.305, 0.305, 0.0]
3 ['O', -0.305, -0.305, 0.0]
4 ['Pb', 0.5, 0.5, 0.25]
5 ['O', 0.195, 0.805, 0.25]
6 ['O', 0.805, 0.195, 0.25]
7 ['Pb', 0.0, 0.0, 0.5]
8 ['O', 0.305, 0.305, 0.5]
9 ['O', -0.305, -0.305, 0.5]
10 ['Pb', 0.5, 0.5, 0.75]
11 ['O', 0.195, 0.805, 0.75]
12 ['O', 0.805, 0.195, 0.75]
像这样:
Atoms = {i:v for i,v in enumerate(L_XYZ)}
方法如下:
Atoms = {**{(max(Atoms, key=int)+1 if Atoms else i): L_XYZ[i] for i,v in enumerate(L_XYZ)},**Atoms}
更新:
似乎问题已编辑,答案实际上更简单:
Atoms = dict(enumerate(L_XYZ))
问题中的else
语句被完全忽略的原因是,
尽管我们在每次迭代期间都向字典中添加项目,
enumerate()
中的字典保持不变,为空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.