目录
  1. 1. Dynamo数据类型
    1. 1.1. 字符串列表:string
    2. 1.2. 字符串转换为整数
    3. 1.3. 对象转换成字符串,如整数等
  2. 2. 两个列表的数据两两相连
  3. 3. 数据拍平
  4. 4. 去除列表中的空值
  5. 5. 去除重复值(去重)
  6. 6. 数据等级修改
  7. 7. 列表排序
    1. 7.1. 行列互换
    2. 7.2. 列表逆序
    3. 7.3. 列表按数据第一位内容顺序排布
    4. 7.4. 列表按数据字符内容顺序排序
    5. 7.5. 按提供的列表排序,亦可用作提取指定项,顺序与给定的列表一致
    6. 7.6. 随机打乱列表
  8. 8. 列表位置移动
  9. 9. 删除列表的项
  10. 10. 替换指定的项
  11. 11. 列表合并
  12. 12. 列表拆分
  13. 13. 列表计数
  14. 14. 列表临近数据分组
  15. 15. 给定列表中,给定长度的所有组合
  16. 16. 列表重复
  17. 17. 在列表开始/结束位置添加一项
  18. 18. 列表拆分
    1. 18.1. 按指定长度拆分
    2. 18.2. 拆分第一项与剩余项分别输出
    3. 18.3. 按指定符号拆分数据,如”,”
  19. 19. 删除项
    1. 19.1. 删除列表中数据的空格内容
    2. 19.2. 按指定步距删除项
    3. 19.3. 从列表开头删除指定数量的项
    4. 19.4. 删除指定的项
    5. 19.5. 从列表中删除非指定类型的项
  20. 20. 提取列表
    1. 20.1. 提取第几到第几项
    2. 20.2. 按项提取列表
    3. 20.3. 从列表开始位置提取固定的几项
    4. 20.4. 按指定间距提取项
    5. 20.5. 使用>,<,≥,≤,=等对数据进行过滤
    6. 20.6. 按bool输出的结果,对true/false的值分别提取
    7. 20.7. 按开始位置,结束位置,间距提取数据
    8. 20.8. 从列表1中提取列表2中没有的数
    9. 20.9. 提取列表1列表2中都有的数据
    10. 20.10. 提取列表的并集,将两个表数据提取到一个表中,一个数据只出现一次
    11. 20.11. 按给定位置提取列表中字符串的字符
  21. 21. 在指定位置插入数据
  22. 22. 列表内容替换
    1. 22.1. 查找内容并替换
    2. 22.2. 查找内容并替换,同时查找并删除空格
    3. 22.3. 指定项的内容替换为所需的内容
    4. 22.4. 根据替换的条件,如>,<,≥,≤,=等条件对满足条件的数据进行替换
  23. 23. 列表数据对比
  24. 24. 查找表1中对应关键字的值使数据可以一一对应
    1. 24.1. 获取一个对应的值
    2. 24.2. 查找对应的值,并输出他在第几项找到的
      1. 24.2.1. 包含组的列表
      2. 24.2.2. 不包含组的列表
    3. 24.3. 从第一个list中查找第二个list的第一项为关键字进行查找,查找后输出第一项一样的,linst1,2的内容,并以list2的顺序排序
    4. 24.4. 以某一符号或文字对数据进行拆分/分割
    5. 24.5. 获取列表中全部对应的值
  25. 25. 去除小数点
  26. 26. 使两个列表内容合并
  27. 27. Python代码中忽略空值对报错的处理;
  28. 28. 本文参考的部分文章
Dynamo中List列表数据处理

   Dynamo中List列表是Dynamo使用中的重要内容,对List列表的正确处理是正确使用Dynamo的前提,本文提供部分常用到的List列表处理方式,可按需使用;本文仍在陆续更新中。

Dynamo数据类型

字符串列表:string

Dynamo输入的内容为列表形式如:["0,255,0","128,255,0"],此方式输入内容为字符串列表;

字符串转换为整数

部分使用情况需要转换为整数,整数样式为[[0,255,0],[128,255,0]],可使用String.ToNumber节点进行字符串到整数的转换:

转换为整数

对象转换成字符串,如整数等

使用String from Object节点,将其他对象转换成字符串以满足使用需求;

对象转字符串

两个列表的数据两两相连

方法一:使用,List.JoinList.Transpose结合,让两个列表的数据两两相连,作为一组;如下图所示:

两两一组

数据两两分组

方法二:使用List.JoinList.Combine节点实现两两分组:

两两分组

两两组合

List.Combine同时支持计算式,如当List.Join替换为*时,可实现列表数据的两两相乘;

两两相乘

两两相乘

数据拍平

使用List.Flatten节点,删除层级关系,可实现多组list作为一个list;

数据拍平

去除列表中的空值

使用List.Clean节点清除列表中的空值;

去除空值

去除重复值(去重)

使用List.UniqueItems节点可以对列表进行去重操作;

单个list去重

当需要同时对一一对应的表格数据进行删除时候,可以将列表组成表格,行列互换厚再使用去重命令;

对应的两个个list去重

数据等级修改

使用List.NormalizeDepth节点为列表添加等级;

数据等级修改

列表排序

行列互换

可使用List.Transpose节点实现行列互换,该功能也可使数据实现两两组合;

行列互换

行列互换

列表逆序

使用List.Reverse节点实现列表顺序逆转

逆序

列表按数据第一位内容顺序排布

使用List.Sort节点,使列表按顺序排列,默认按第一位排序,如下生成为按第一个字母顺序进行排序;

顺序排序

列表按数据字符内容顺序排序

使用List.SortByKey节点,实现列表按数据字符内容进行排序;

按数据字符排序

按提供的列表排序,亦可用作提取指定项,顺序与给定的列表一致

使用List.Reorder节点,实现多项提取,提取的数据按照提取项的列表顺序排列;

指定项排序

随机打乱列表

使用List.Shuffle节点随机打乱列表内容;

随机打乱

列表位置移动

使用List.ShiftIndices实现列表向左/右移动;

位置移动

删除列表的项

使用List.RemoveItemAtIndex节点删除指定的项;

删除项

替换指定的项

使用List.ReplaceItemAtIndex节点替换指定的项列表;

替换项

列表合并

使用List.Create节点将多个列表合并成一个列表;原本子列表在大列表中是平行的关系。

列表合并

使用List.Join合并的列表,生成的子列表为单个列表;

合并/相连

列表拆分

使用List.Chop节点实现列表拆分,通过输入拆分间距进行拆分;将列表分割为指定长度的一组连续子列表。

![Untitled](C:\Users\earth\Desktop\C:\Users\earth\Desktop\List 列表处理 ©嗜血星空earth 1911871e92ee4422b06c95573be54e11\Untitled 6.jpeg)

列表计数

使用List.Count返回列表的项数,只能计算第一个层级的项数;

项数

使用List.Map结合List.Count可以实现第二个层级项数的计算

层级项数

列表临近数据分组

使用List.Sublists节点,实现对列表临近数据分组;

相邻两个逐个组合,步进值为1

相邻两个逐个组合,步进值为1

相邻两个逐个组合,步进值为2

相邻两个逐个组合,步进值为2

每隔三个去除一个,四个同理;

每隔三个去除一个,四个同理;

给定列表中,给定长度的所有组合

使用List.Combinations节点,生成给定列表中给定个数的所有组合;

Untitled

列表重复

方法一:使用List.Cycle节点按指定次数重复输入的数列,输出结果为一个数列;

Untitled

方法二:使用List.OfRepeatedItem节点按指定次数重复输入的数列,输出的重复数列作为单独的list输出;

Untitled

在列表开始/结束位置添加一项

使用List.AddItemToFront节点,实现在列表开始位置添加一项;

Untitled

使用List.AddItemToEnd节点,实现在列表结束位置添加一项;

Untitled

列表拆分

按指定长度拆分

使用List.Chop节点,实现列表按指定长度拆分成多个列表;

Untitled

拆分第一项与剩余项分别输出

使用List.Deconstruct拆分第一项与除第一项外剩余的项,分别输出两个list

Untitled

按指定符号拆分数据,如”

使用以下代码,实现按指定符号拆分数据,如根据位置拆分RGB色值;

Untitled

Untitled

其中[['0','255','0'],['128','255','0']]样式输出为字符串,为满足使用需求,可转换为其他种类,如[[0,255,0],[128,255,0]]为整数

Untitled

1
2
3
LIST1 = IN[0]
LIST2 = [item.split(",") for item in LIST1]
OUT = LIST2

删除项

删除列表中数据的空格内容

删除空格

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 假设你的数据是列表形式  
#data = ["这 是 一 段 含 有 空 格 的 数 据", "这是另一个含有空格的数据"]

data = IN[0]

# 使用列表解析式和replace()函数去除空格
data_no_spaces = [item.replace(' ', '') for item in data]

OUT = data_no_spaces # 输出: ['这是一段含有空的数据', '这是另一个含有空格的数据']

# 假设你的数据是字符串形式
#data = "这 是 一 段 含 有 空 格 的 数 据"

# 使用replace()函数去除空格
#data_no_spaces = data.replace(' ', '')

#print(data_no_spaces) # 输出: 这是一段含有空的数据

按指定步距删除项

使用List.DropEveryNthItem节点实现按指定步距删除项;offset参数可设置从开始位置忽略的项数;

Untitled

从列表开头删除指定数量的项

使用List.DropItems节点从列表开始位置删除指定数量的项;

Untitled

删除指定的项

使用List.RemoveItemAtIndex节点删除数列中指定的项;

Untitled

从列表中删除非指定类型的项

使用List.RemoveIfNot节点,可提取列表中的一种类型,把其他的类型删除;如单独提取字符串/数字;如下图所示,若需要提取数字,则type输入参数为int

Untitled

提取列表

提取第几到第几项

使用Code Block节点,输入a[x],可以提取指定的项,输入a[x..y];可以提取从x~y的项;

Untitled

按项提取列表

使用List.GetItemAtIndex节点提取列表的项;

Untitled

从列表开始位置提取固定的几项

使用List.TakeItems节点从列表开始位置提取指定数量的项;

Untitled

按指定间距提取项

使用List.TakeEveryNthItem节点按指定的间距提取项;

Untitled

使用>,<,≥,≤,=等对数据进行过滤

使用List.Filter节点对数据进行对比过滤,实现提取对比后的数据;如提取大于6的数据;

Untitled

按bool输出的结果,对true/false的值分别提取

使用后List.FilterByBoolMask节点,按bool的值区分数据,分别提取值为true/false的数值;

Untitled

按开始位置,结束位置,间距提取数据

使用List.Slice节点,按开始位置,结束位置,间距 提取所需数据;

Untitled

从列表1中提取列表2中没有的数

使用List.SetDifference节点,从列表1中提取列表2中没有的数

Untitled

提取列表1列表2中都有的数据

使用List.SetIntersection节点提取列表1列表2中都有的数据

Untitled

提取列表的并集,将两个表数据提取到一个表中,一个数据只出现一次

使用List.SetUnion节点,把两个表的内容补充的一起,重复的数据只出现一次;

Untitled

按给定位置提取列表中字符串的字符

使用String.Substring节点,提取指定开始位置喝字符串的长度;

Untitled

在指定位置插入数据

使用List.Insert节点在指定位置插入数据;

Untitled

列表内容替换

查找内容并替换

实现查找替换成-

1
2
3
LIST1 = IN[0]
LIST2 = [item.replace(',', '-') for item in LIST1]
OUT = LIST2

查找内容并替换,同时查找并删除空格

1
2
3
LIST1 = IN[0]
LIST2 = [x.replace(',', '-').replace(' ', '') for x in LIST1]
OUT = LIST2

指定项的内容替换为所需的内容

使用List.ReplaceItemAtIndex节点,将第五项的内容替换为11;

Untitled

根据替换的条件,如>,<,≥,≤,=等条件对满足条件的数据进行替换

使用ReplaceByCondition节点对满足条件的数据进行替换;

Untitled

列表数据对比

使用String.Contains节点查找列表中是否包含选定的字符串,输出bool,包含为true否则为false;建议使用Orchid中的节点;

Untitled

结合List.FilterByBoolMask节点可以对包含/不包含的数据进行删除处理;

查找表1中对应关键字的值使数据可以一一对应

获取一个对应的值

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LIST1 = IN[0]  
LIST2 = IN[1]

DICT = {}
DICT1=[]

for i in LIST1:
DICT[i[0]] = i[1] # 将i的第一个元素作为键,第二个元素作为值添加到字典中 可按需修改;

for i in LIST2:

VALUE = DICT[i]
DICT1.append(VALUE)


OUT = DICT1 # 输出找到的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LIST1 = IN[0]    
LIST2 = IN[1]

DICT = {}
DICT1=[]

for i in LIST1:
DICT[i[0]] = i[1] # 将i的第一个元素作为键,第二个元素作为值添加到字典中

for i in LIST2:
VALUE = DICT.get(i)
if VALUE is not None:
DICT1.append(VALUE)

OUT = DICT1 # 输出找到的值

查找对应的值,并输出他在第几项找到的

包含组的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LIST1 = IN[0]  
LIST2 = IN[1]

DICT = {}
RESULT = [] # 使用RESULT来存储找到的值和它们在LIST2中的索引

# 处理LIST1
for i in LIST1:
DICT[i[0]] = i[1]

# 处理LIST2
for index, value in enumerate(LIST2): # 使用enumerate来获取LIST2中每个元素的索引和值
found_value = DICT.get(value)
if found_value is not None:
RESULT.append((found_value, index)) # 将找到的值和索引作为一个元组添加到RESULT中

OUT = RESULT # 输出找到的值和它们在原列表中的位置

不包含组的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 假设输入是两个列表  
LIST1 = IN[0] # 第一个列表,包含值
LIST2 = IN[1] # 第二个列表,包含要在第一个列表中查找的值

# 初始化一个空列表来存储结果
results = []

# 遍历第二个列表中的每个元素
for value_to_find in LIST2:
# 尝试在第一个列表中找到该元素的值和索引
try:
# 使用列表的index方法找到元素的索引,如果元素不存在则抛出ValueError
index = LIST1.index(value_to_find)
# 将找到的值和索引添加到结果列表中
results.append((value_to_find, index))
except ValueError:
# 如果元素不存在于第一个列表中,则不添加任何内容到结果列表中
# 或者,你可以选择添加一个特定的标记来表示未找到,比如 (None, -1)
# results.append((None, -1))
pass # 这里选择不添加任何内容

# 输出结果
OUT = results

从第一个list中查找第二个list的第一项为关键字进行查找,查找后输出第一项一样的,linst1,2的内容,并以list2的顺序排序

内容与上诉查找一样,增加数据排序功能;

增加排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LIST1 = IN[0]  
LIST2 = IN[1]

# 创建一个字典来存储LIST1中的键值对
dict_ = {k: v for k, v in LIST1}

# 准备两个空列表来存储输出结果
OUT1 = []
OUT2 = []

# 遍历LIST2,根据其中的键来查找LIST1中的对应值
for key, value in LIST2:
# 在LIST1(现在存储在dict_中)中查找键
if key in dict_:
# 如果找到了,将LIST1中的对应元组添加到OUT1
OUT1.append((key, dict_[key]))
# 同时将LIST2中的当前元组添加到OUT2
OUT2.append((key, value))

OUT = OUT1,OUT2

以某一符号或文字对数据进行拆分/分割

使用String.Split节点可以实现对数据分割,如原数据为NLG-72-950可拆成三组数据;

分割符

获取列表中全部对应的值

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LIST1 = IN[0]      
LIST2 = IN[1]

DICT = {}
DICT1=[]

for i in LIST1:
key = i[0]
value = list(i) # 将剩余的所有元素作为值
DICT[key] = value # 将i的第一个元素作为键,剩下的所有元素作为值添加到字典中

VALUE2 = [DICT.get(i, []) for i in LIST2] # 输出找到的值

OUT=VALUE2

上述代码实现功能与使用List.IndexOfList.GetItemAtIndex节点组合的效果趋于一致;

  • List.IndexOf —— 返回搜索内容的项编号
  • List.GetItemAtIndex —— 根据项编号提取对应项

Untitled

去除小数点

Untitled

使两个列表内容合并

使用List.Combine节点合并两个列表,实现字段文字添加前后缀;

Untitled

Python代码中忽略空值对报错的处理;

示例:

1
2
3
4
5
6
7
eles = []
TransactionManager.Instance.EnsureInTransaction(doc)
for e in enum[1:6]:
rule = RM.GetRule(e,0)
eles.append(doc.GetElement(rule.MEPPartId).ToDSType(False))
TransactionManager.Instance.TransactionTaskDone()
OUT = eles

以上for e in enum[1:6]:

获取1~6的内容中,若其中包含空值,会报错;在此需加入`try:以及**except:pass`**可对报错进行忽略;(此方式直接忽略,没有任何提示)如下所示:

1
2
3
4
5
6
7
8
9
10
11
eles = []
TransactionManager.Instance.EnsureInTransaction(doc)
for e in enum[1:6]:
try:
rule = RM.GetRule(e,0)
eles.append(doc.GetElement(rule.MEPPartId).ToDSType(False))
except:
pass

TransactionManager.Instance.TransactionTaskDone()
OUT = eles

或者使用如下代码实现上方效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```python
eles = []
TransactionManager.Instance.EnsureInTransaction(doc)
for e in enum[1:6]:
rule = RM.GetRule(e,0)
if rule is not None:
element = doc.GetElement(rule.MEPPartId)
if element is not None:
eles.append(element.ToDSType(False))
else:
# 处理规则为空的情况,例如记录错误或设置默认值等
pass
TransactionManager.Instance.TransactionTaskDone()
OUT = eles
```

本文参考的部分文章

Dynamo中列表基本操作

文章作者: 嗜血星空earth
文章链接: http://sxxkearth.github.io/2023/10/12/Dynamo%E4%B8%ADList%E5%88%97%E8%A1%A8%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请附以署名及出处!

评论