欢迎各位兄弟 发布技术文章
这里的技术是共享的
data_A = sheet.range('A2').expand('down').value
data_B = sheet.range('B2').expand('down').value
data_A_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_A]
data_B_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_B]
for a, b in zip(data_A_list, data_B_list):
AB_dict.update({a: b})
data = list(AB_dict.keys())
data2 = list(AB_dict.values())
for i in data:
own_id.append(str(i))
for ii in data2:
leader_id.append(str(ii)) 详解
这段 Python 代码处理来自电子表格的两列数据,可能使用类似 xlwings
的库来实现 Excel 自动化。下面是每部分的具体解析:
初始化空字典:
AB_dict = {}
这里初始化了一个空字典 AB_dict
,用于存储两个数据列的键值对。
从电子表格中提取数据:
data_A = sheet.range('A2').expand('down').value
data_B = sheet.range('B2').expand('down').value
sheet.range('A2').expand('down').value
:从 A2 单元格开始,向下扩展,获取 A 列的所有值。
sheet.range('B2').expand('down').value
:类似地,从 B2 单元格开始,向下扩展,获取 B 列的所有值。
转换数据为列表并处理数据类型:
data_A_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_A]
data_B_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_B]
使用列表推导式将每个元素转化为字符串。如果元素是浮点数,则会在字符串中找到小数点并取小数点前的部分(有效地将其转换为整数部分)。
创建键值对字典:
for a, b in zip(data_A_list, data_B_list):
AB_dict.update({a: b})
zip()
函数将来自 data_A_list
和 data_B_list
的每个元素配对,然后更新 AB_dict
字典,其中键来自 data_A_list
,值来自 data_B_list
。
提取键和值到单独的列表:
data = list(AB_dict.keys())
data2 = list(AB_dict.values())
在这里,data
将包含所有的键(来自 A 列的原始值),而 data2
将包含所有的值(来自 B 列的原始值)。
将键和值分别添加到单独的列表中:
for i in data:
own_id.append(str(i))
for ii in data2:
leader_id.append(str(ii))
此部分循环遍历 data
和 data2
中的每个元素,将其字符串表示形式分别附加到 own_id
和 leader_id
列表中。
该代码有效地创建了一个 Excel 表中两列数据之间的映射。
代码在处理不同数据类型(例如浮点数)时,能够保持整洁,去除了小数部分。
最终,来自电子表格的键(ID)和值被妥善地附加到各自的列表中,以便后续处理。
错误处理:可以添加错误处理,以防止出现其中一个列表比另一个长的情况。
数据验证:在更新字典之前,可以检查是否有重复的键,以避免后续可能出现的问题。
代码可读性:在代码中添加注释,将其结构化为函数,可以提高可读性和可维护性。
data_A_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_A] 详解
我们来详细解析这一行代码:
data_A_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_A]
这一行使用了 列表推导式(list comprehension),其结构是 [表达式 for 变量 in 可迭代对象]
。在这个特定情况下,它的作用是遍历 data_A
中的每一个元素 item
,根据 item
的类型决定如何处理它,并将处理后的结果生成一个新的列表 data_A_list
。
遍历数据:
for item in data_A
:这部分代码表示要遍历 data_A
列表中的每一个元素,并将当前元素赋值给变量 item
。
判断条件:
if isinstance(item, float)
:这是一个条件判断,用于检查 item
是否是一个浮点数。 isinstance()
是 Python 的内置函数,返回 True
或 False
。
处理浮点数:
str(item)
:首先将浮点数转换为字符串。
.split('.')
:再以小数点 .
为分隔符,分割字符串,返回一个列表,列表的第一个元素是小数点前的部分。
[0]
:使用 [0]
取这个列表的第一个元素,即小数点前的部分。
str(item).split('.')[0]
:如果 item
是浮点数,这部分代码将执行以下操作:
处理非浮点数的情况:
else str(item)
:如果 item
不是浮点数,那么就直接将其转换为字符串,保存原始值。
综上所述,这一行代码的整体目的如下:
生成一个新的列表 data_A_list
,该列表中的每个元素来自 data_A
中的元素:
如果元素是浮点数,取其整数部分(小数点前的部分)。
如果元素不是浮点数,直接将其转换为字符串。
假设 data_A = [1.5, 2, 'Hello', 3.7, 5]
,执行这行代码后,生成的 data_A_list
将是:
1.5
-> 转换为字符串后分割,取 '1'
2
-> 直接转换为字符串 '2'
'Hello'
-> 直接转换为字符串 'Hello'
3.7
-> 转换为字符串后分割,取 '3'
5
-> 直接转换为字符串 '5'
因此,最终的 data_A_list
将是 ['1', '2', 'Hello', '3', '5']
。
str(item).split('.')[0] 为什么 在 if 后面执行
在这一行代码中:
data_A_list = [str(item).split('.')[0] if isinstance(item, float) else str(item) for item in data_A]
str(item).split('.')[0]
的执行是在 if
条件为真(即 item
是浮点数)的情况下进行的,这是因为 Python 的列表推导式和条件表达式的语法结构。来具体分析一下为何它会在 if
后面执行:
这段代码使用了 条件表达式(通常称为三元运算符)的形式 value_if_true if condition else value_if_false
,简化了场景处理。我们可以分解这一结构:
条件判断:
isinstance(item, float)
:判断 item
是否为浮点数(float
类型)。
两种可能的返回值:
如果条件为真(即 item
是浮点数),将执行 str(item).split('.')[0]
。
如果条件为假(即 item
不是浮点数),则执行 str(item)
,将 item
直接转换为字符串。
避免错误:通过首先检查 item
的类型,只有在确定 item
是浮点数时才去尝试将其转换为字符串并分割。这避免了对不是浮点数的元素执行 split()
方法,可能导致运行时错误。
处理不同类型的输入:这段代码可以有效地处理和转换来自 Excel 或其他数据源的多种数据格式,包括浮点数、整数、字符串等,确保得到一个统一格式的列表 data_A_list
。
简洁性:这个写法结合了条件判断和列表生成,避免了使用多行代码来实现同样的功能,使代码更简洁易读。
假设 data_A
是这样的一个列表:
data_A = [1.5, 2, 'Hello', 3.7, 5]
执行列表推导式的过程如下:
对于 1.5
:
isinstance(1.5, float)
为 True
,执行 str(1.5).split('.')[0]
,得到 '1'
。
对于 2
:
isinstance(2, float)
为 False
,执行 str(2)
,得到 '2'
。
对于 'Hello'
:
isinstance('Hello', float)
为 False
,执行 str('Hello')
,得到 'Hello'
。
对于 3.7
:
isinstance(3.7, float)
为 True
,执行 str(3.7).split('.')[0]
,得到 '3'
。
对于 5
:
isinstance(5, float)
为 False
,执行 str(5)
,得到 '5'
。
最终 data_A_list
会是:
data_A_list = ['1', '2', 'Hello', '3', '5']
str(item).split('.')[0]
在 if
后面执行是为了确保只有在 item
是浮点数的情况下才对其进行编程操作,从而避免了不必要的错误,同时处理了多种数据类型的情况。这种结构设计既高效又易于阅读。