Python其实很简单 第十章 字典与集合

Python011

Python其实很简单 第十章 字典与集合,第1张

前面介绍的列表和元组都是有序序列,而字典与集合属于无序序列,也就是说,不能通过索引来操作元素

10.1 字典

语法格式:

dictionary= {key1 : value1, key2 : value2, key3 : value3 ,...., key n : value n }

其中,dictionary是字典名称,key表示元素的键,value表示元素的值,键和值必须是成对的。

如:

>>>dict1 = { 'abc': 123, 98.6: 37 }

>>>dict1

{'abc': 123, 98.6: 37}

可以看出,键可以是字符串、数字或者元组,但必须是唯一的;而值可以是任何数据类型,也没有要求是唯一的。

1、创建字典的方法

方法一:同时给定键和值,即“关键字参数”形式。

dictionary=dict(key1=value1,key2=value2,.....,key n=value n)

注意:这里的key 必须符合Python标识符的命名规则。

例:

先使用“{}”创建字典:

>>>dict1={1:'一',2:'二',3:'三',4:'四',5:'五'}

>>>dict1

{1: '一', 2: '二', 3: '三', 4: '四', 5: '五'}

再通过“关键字参数”形式创建:

>>>dict1=dict(1='一',2='二',3='三',4='四',5='五')

SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

创建不成功,原因在于key 不符合Python标识符的命名规则。前面已经介绍过,标识符不能用数字表示或者用数字打头。

现在对键如下修改:

>>>dict1=dict(n1='一',n2='二',n3='三',n4='四',n5='五') #在数字前加了一个字符”n”

>>>dict1

{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}

方法二 :使用已经存在的元组和列表通过映射函数创建字典。

格式:dictionary=dict(zip(tuplekey,listvalue))

例:

>>>tuplekey=('n1','n2','n3','n4','n5') #键的序列采用元组

>>>listvalue=['一','二','三','四','五'] #值的序列采用列表

>>>dict1=dict(zip(tuplekey,listvalue))

>>>dict1

{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五'}

注意:tuple(listname)函数可以将列表转换为元组,list(tuplename)函数可以将元组转换为列表。

2、通过键访问字典

直接获取键的相应元素的值

>>>dict1['n2']

'二'

利用get()方法

>>>dict1.get('n2')

'二'

get()方法也可以带参数,当要访问的键不存在时返回一个字符串。如:

>>>dict1.get('n0','can't find!') #当要查找的键不存在,返回'can't find!'

"can't find!"

3、遍历字典

使用字典对象的items()方法可以获取字典的“键.值对”列表。

>>>for item in dict1.items():

print(item)

('n1', '一')

('n2', '二')

('n3', '三')

('n4', '四')

('n5', '五')

也可以获取具体的每个元素的键和值,如:

>>>for key,value in dict1.items():

print(key,'对应的是',value)

n1 对应的是 一

n2 对应的是 二

n3 对应的是 三

n4 对应的是 四

n5 对应的是 五

4、添加、修改和删除字典元素

使用下面的语句,若指定的键存在,就可以修改该元素的值;若指定的键不存在,则添加该元素。如:

>>>dict1['n6']='六' # 键’n6’不存在,故添加该元素

>>>dict1

{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '四', 'n5': '五', 'n6': '六'}

>>>dict1['n4']='肆' # 键’n4’存在,故修改该元素

>>>dict1

{'n1': '一', 'n2': '二', 'n3': '三', 'n4': '肆', 'n5': '五', 'n6': '六'}

5、利用推导式建立字典

import random

dict1={i:random.randint(1,100) for i in range(5)}

# 生成元素的键为0到5整数,值为1到100之间的随机数

print(dict1)

运行结果:{0: 28, 1: 59, 2: 79, 3: 30, 4: 88}

10.2 集合

集合是数学中一个很重要的概念,集合具有确定性、互异性、无序性三个基本属性。在Python中,集合同样具有这三个基本属性,其中,确定性是指对象要么是集合的元素,要么不是集合的元素;互异性是指集合中的元素不能重复;无序性是指集合中的元素不分先后次序,可以随意更换位置。

1、集合的创建

直接使用“{}”创建

>>>set1={'春','夏','秋','冬'}

>>>set1

{'秋', '春', '冬', '夏'}

>>>set2={3,2,1,4,5}

>>>set2

{1, 2, 3, 4, 5}

利用已有的列表、元组创建集合

>>>list1=['东','南','西','北']

>>>set3=set(list1)

>>>set3

{'南', '东', '北', '西'}

利用已有的集合建立一个“副本”

>>>set3

{'南', '东', '北', '西'} #set3和set4的值一样

>>>set4=set3

>>>set4

{'南', '东', '北', '西'}

>>>set4.add('中') #给set4添加元素

>>>set4

{'西', '中', '东', '南', '北'} # 这个好理解

>>>set3

{'西', '中', '东', '南', '北'} # 意想不到吧?Set3为什么会发生变化?

再看看简单变量的情况:

>>>a=2

>>>b=a #是不是与前面set4=set3相似

>>>b+=1

>>>b

3

>>>a

2 #但a的值并没有发生改变

从上面集合set3、set4和简单变量a、b的值的变化情况对比,不难发现set3和set4是指向同一地址的对象,而变量a和变量b指向了不同地址,语句b=a是将a的值传递个b,并不是将a的地址传递给b。列表、元组、字典都和集合一样具有这样的性质。

所以,将set4称为set3的“副本”更为恰当。

2、添加和删除元素

>>>set3

{'南', '东', '北', '西'}

>>>set3.add('中') # 添加元素

>>>set3

{'西', '中', '东', '南', '北'} # 集合内的元素是无序的,不要纠结次序的变化

>>>set3.remove('中') # 删除元素

>>>set3

{'西', '东', '南', '北'}

3、集合运算

集合运算包括交(&)、并(|)、差(-),和数学中的集合运算是一致的。

>>>set3={'南', '东', '北', '西'}

>>>set4={'西', '中', '东', '南', '北'}

>>>set3 &set4 #取set3和set4的交集

{'西', '南', '北', '东'}

>>>set3 | set4 #取set3和set4的并集

{'中', '南', '北', '西', '东'}

>>>set3 - set4 #取set3与set4的差,即set3比set4多出来的元素

set()

>>>set4 -set3 #取set4与set3的差,即set4比set3多出来的元素

{'中'}

Fluent UDF中经常用到thread*类型的指针,一般可以通过如下函数来获取。

Lookup_Thread(Domain*domain, int id)

其中id是边界面的ID或者cell区域的ID,如下图中outlet边界的ID是2。

遗憾的是,网格载入Fluent后,其ID都是无法事先确定的。很多朋友只有在UDF源码开头用如下代码根据事后查到的ID手动定义,每次网格一变化又得重新在源码里面修改,重新编译,十分影响通用性。

#define OUTLET_ID 2 //每次不同网格需要根据情况修改后重新编译

Domain* domain=Get_Domain(1)//非多相流或多相流混合物的domain永远是1

Thread*tf=Lookup_Thread(domain, OUTLET_ID)

有没有一种办法能够一次性源码编译达到适应于所有网格呢?答案当然是肯定的,你可以通过zone名字来获取其ID号,然后画网格的时候只要取相同名字即可。实现该功能的函数源代码如下(插件VC++ UDF Studio 2022R1学术版上编译通过)

#include "udf.h"

#include "SuperUdfExtension.h" //VC++ UDF Studio自带的扩展库头文件,具体参考该软件中的编程手册

#pragma comment(lib, "SuperUdfExtension.lib") //VC++ UDF Studio自带的扩展库的lib文件

int GetZoneIdByName(CString zoneName) //适用于所有Fluent版本

{

int returnID=-1

Domain*domain=Get_Domain(1)

CString strCurrentFluentVersion

strCurrentFluentVersion.Format("%d.%d", RampantReleaseMajor, RampantReleaseMinor)//格式化当前Fluent版本为字符串形式

double fCurrentFluentVersion = atof(strCurrentFluentVersion.GetBuffer())//当前Fluent版本转为double类型

if(fCurrentFluentVersion<=19.2) // 对于Fluent6.3-19.2,只能调用VC++ UDF Studio扩展库

{

SuperUdf_Initialize(AfxGetInstanceHandle())//调用VC++ UDF Studio扩展库中任何函数之前必须调用此初始化函数,具体参考该软件中的编程手册

#if !RP_NODE

returnID=SuperUdf_GetZoneIdByName(zoneName.GetBuffer())//调用VC++ UDF Studio扩展库中的SuperUdf_GetZoneIdByName函数,具体参考该软件中的编程手册

#endif

host_to_node_int_1(returnID)

}

else // 对于Fluent version >=19.3,有直接UDF函数可以实现

{

Thread*tf

thread_loop_f(tf, domain) //对所有面的thread进行循环查找

{

if(0==zoneName.CompareNoCase(THREAD_NAME(tf))) //对比名字是否相同

{

returnID=THREAD_ID(tf)

break

}

}

if(-1==returnID) //如果面的thread中无法找到匹配名字

{

Thread*tc

thread_loop_c(tc, domain) //对所有网格的thread进行循环查找

{

if(0==zoneName.CompareNoCase(THREAD_NAME(tc))) //对比名字是否相同

{

returnID=THREAD_ID(tc)

break

}

}

}

}

return returnID

}

DEFINE_EXECUTE_ON_LOADING(get_id, libudf)

{

int theID=GetZoneIdByName("inlet")//根据边界名字获取其ID,如果返回-1表示找不到

Message("the zone id of inlet is %d\n",theID)

}

以上源代码实现了通过zone名字来获取其ID号的功能。对于Fluent19.3或更高版本,可以利用THREAD_NAME与需要的名字进行对比,匹配情况下用THREAD_ID获得其ID。但对于Fluent19.2或更低版本, THREAD_NAME不起作用(可能Fluent的bug),我们只能依赖于插件VC++ UDF Studio中的拓展库函数SuperUdf_GetZoneIdByName来实现。是时候抛弃傻傻的#define ID了。

点击阅读全文

打开CSDN,阅读体验更佳

参与评论 请先 登录 后发表或查看评论

最新发布 FLUENT UDF 入门级代码及解释

FLUENT UDF 入门级代码及解释

继续访问

fluent udf手册_FLUENT并行UDF案例

正文共:2618字9图 预计阅读时间:7分钟1 前言当计算网格数量巨大时,如果还用串行计算的话,可以把人耗死。此时用并行计算可以显著节省时间,笔者在实际应用中深有体会。同样一个案例(网格数量约200万),串行计算大约10秒钟迭代一次,而改用25核并行计算,约2秒钟迭代一次。其实在我看来,模拟计算一定程度上比的就是计算机性能。特别当遇到网格数量巨大,且物理模型复杂的计...

继续访问

【Fluent Meshing】04:计算域提取

1.导入几何模型 2.创建网格尺寸 右键选择模型树节点Model,点击弹出菜单下Sizing → Scoped…弹出尺寸设置对话框 弹出对话框中如下图所示设置参数,点击Create按钮创建全局面尺寸分布 弹出对话框中如下图所示设置参数,点击Create按钮创建全局线尺寸分布 点击按钮Compute计算尺寸分布,待计算完毕后关闭对话框 3.重构网...

继续访问

获取宏定义_ANSYS Fluent:关于 UDF 的数据类型和相关的宏

在写 Fluent UDF 的过程中,我们经常会看到大量的诸如 d,c,f,t 这种变量,以及 domain,cell_t,face_t 等声明。如果自定义 UDF 的需求较高,我们就需要弄明白这些东西的含义。数据类型首先看一下 Fluent 的网格构成。在“ANSYS Fluent UDF Manual”中写道,A mesh is broken up into control volumes, ...

继续访问

Fluent的UDF官方案例(含代码)

8个官方给定的案例(含代码):多孔介质、壁温、粘度、UDS、流化床、非均匀流动、沉降、动网格。121页内容,提供代码供参考,简单易学

halcon算子翻译——get_domain

名称 get_domain - 获取图像的域(ROI)。 用法 get_domain(Image : Domain : : ) 描述 算子get_domain将所有输入图像的定义域作为区域返回。 并行 ●支持计算设备上的对象。 ●多线程类型:可重入(与非独占算子并行运行)。●多线程范围:全局(可以从任何线程调用)。●在元组级别自动并行化处理。 参数 Image ...

继续访问

圆柱绕流UDF-parallel主动运动

# include "udf.h" //主动运动 static real pretime=0.0static real timestepstatic real y1=0.0static real prev1=0.0static int surface_thread_id1=4static real m1=7.286static real c1=2.644723static real k1=600.0static real p=999.729static real s=.

继续访问

ansys fluent udf manual 下载_【笔记】使用UDF进行Fluent并行计算时主机与节点之间的数据传递...

导言:在使用Fluent进行大规模并行计算时,难免会遇到主机与节点之间的需要数据传输的情况。Fluent在UDF使用手册中虽然提供了关于并行计算中的数据传输宏的定义与格式表述,但并没有给出相应的示例与详解。此外,在各平台也难以找到较为明晰的用法解释。本文将对Fluent应用UDF进行并行计算时的数据传输方式以及传输宏的使用方法进行详解。1. Fluent 的并行计算架构简介图1. Fluent 并...

继续访问

Fluent UDF中判断壁面热边界类型

我们知道Fluent中壁面可以有不同的换热边界类型,比如给定热流量的类型,给定温度的类型,给定对流条件的类型等等。 UDF中有时候需要根据类型的不同来进行不同的处理。那么在Fluent UDF中该如何判断一个壁面是什么类型的热边界呢?这里为大家解密几个未写入UDF帮助手册的宏。 宏 作用 HEAT_FLUX_WALL(Thread*tf) 判断是否是给定热流量的边界 TEMPERATURE_......

继续访问

UDF学习记录

一、数据结构 Cell thread对应zone Face thread对应边界 Example变量名可以随意定义,变量名不能重复 二、几何宏、循环宏 几何宏 原则:宏(c,t)t指的是cell thread, 宏(f,t)t指的是face thread A[ND_ND] 图形是三维ND_ND=3,二维ND_ND=2 F_AREA(A,f,t) 求面法向量,加上NV_MAG(A)算面的面积 循环宏 Thread_loop_c必须和begin_c_loop一起使用

继续访问

条件include_FLUENT边界条件的引用

正文共:2248字4图 预计阅读时间:6分钟1 前言 太阳能热水器在很多太阳能资源丰富的地区相当常见,笔者老家楼顶就有一台太阳能热水器。在一些大型建筑中,可能是多台设备串并联在一起。对于串联的模块,一台热水器的出口接到另一台的入口。假设不...

继续访问

Fluent UDF中使用智能动态数组

Fluent UDF中使用智能动态数组 Fluent UDF中要使用动态数组在传统编译方法中只能使用纯C语言中的malloc函数。此函数无法自动释放内存,必须手动调用free函数来释放,否则就会造成内存泄漏问题。 要想使用智能动态释放的数组,就必须将UDF语法拓展到C++语言,调用C++内置的智能动态数组vector支持。这里我们借助VC++ UDF Studio的插件来实现对智能动态数组的调用。例如下面例子实现将入口面的压力和温度存入动态数组,然后再将存储的压力值赋值给出口。 #include "u

继续访问

Fluent UDF中沿指定方向获取邻接网格

有朋友在VC++UDF Studio插件群里问Fluent UDF有没有宏可以沿着指定方向搜索到下一个邻接的网格?答案是No,没有现成的宏可以实现这个目的,但是我们可以写一个函数来手动实现。这个思路如下:对于当前的网格,我们可以利用c_face_loop宏配合C_FACE及C_FACE_THREAD宏,对当前网格的所有face进行循环,例如下图中的当前网格循环会有0,1,2,3四个face。然后我们再利用F_C0分别取这四个face的c0,将c0与当前网格比较,如果c0就是当前网格,那么邻接网格就是c1,反

继续访问

udf在服务器上显示语法错误,UDF代码错误在哪里啊? - 仿真模拟 - 小木虫 - 学术 科研 互动社区...

用组分输运模型模拟一个三维圆柱内的组分输运问题,圆柱壁面对组分有吸收。圆柱等分为两段,前一段标为huxi ,后一段标为xiu。由于壁面对组分的吸收缘故,必然使圆柱内从前往后浓度依次降低。从而下面的代码应该huxi2 与xiu2的值不同才是,但我得到的结果是huxi2与xiu2的值完全一样,奇了怪了,#include "udf.h"#define Dm 6.9e-5DEFINE_ON_DEMAND(...

继续访问

msh,fluent格式

# **10:Nodes (10 (zone-id first-index last-index type ND)) 12.Cells (12 (zone-id first-index last-index type element-type)) 13.Faces (13 (zone-id first-index last-index type element-type) (n0 n1 n2 cr cl)) type: element-type: 当element-type

继续访问

热门推荐 Log4j2研究之lookup

一个称得上优秀的框架,必备的要素之一可以通过某种约定的格式读取到所运行环境中的配置信息。本文中我们就来感受下log4j2实现此项功能时的精妙设计。

继续访问

get_domain_ip

#!/bin/bash if[$#-lt1]then echo$0needaparameter exit0 fi ADDR=$1 TMPSTR=`ping${ADDR}-c1|sed'1{s/.*([]∗[]∗)56.*/\1/q}'` #TMPSTR=`ping${ADDR}-c...

继续访问

Fluent UDF 获取组分传输模型中的摩尔分数或分压力

很多朋友在开发Fluent模型中需要用UDF获取组分传输模型中的某气体组分的摩尔分数(或体积分数)或者分压力,但是UDF自带的只有获取质量分数的宏C_YI(c,t),需要自己写额外的代码去转换,有一定难度。已经不止一次看到论坛或者我们UDF编译调试插件群里的朋友问起这个问题,这里做个标准教程记录下来,希望对大家有用。 总体来说,有两种方法,一种是利用内置的函数来转换,另外一种就是自己写代码转换,这里逐一介绍。 1. 利用内置函数转换 内置转换方法参考了Fluent官方解决方案,稍微作了一些修改,并加了

继续访问

Linux功耗管理(17)_Linux PM domain framework(1)_概述和使用流程

1. 前言 在复杂的片上系统(SOC)中,设计者一般会将系统的供电分为多个独立的block,这称作电源域(Power Domain),这样做有很多好处,例如: 1)将不同功能模块的供电分开,减小相互之间的干扰(如模拟和数字分开)。 2)不同功能所需的电压大小不同:小电压能量损耗低,但对信号质量的要求较高;大电压能量损耗高,对信号质量的要求较低。