繁体   English   中英

多语句的字典理解

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM