欢迎各位兄弟 发布技术文章
这里的技术是共享的
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 是浮点数的情况下才对其进行编程操作,从而避免了不必要的错误,同时处理了多种数据类型的情况。这种结构设计既高效又易于阅读。