从连接设备信息生成器创建列表:如何合并循环子列表
问题:合并USB设备信息列表失败,仅保留最后一项
我用subprocess结合grep获取已连接USB设备的信息,每个设备的信息单独处理,通过生成器device_list()返回数据。循环处理生成器输出时,能正常打印每个设备的拆分结果(比如['item1']、['item2']),但循环结束后打印list1,却只剩最后一个设备的['item3'],想要得到合并后的列表['item1', 'item2', 'item3']。
现有代码结构
devices_connected = subprocess.getoutput(grep function to grab number of usb devices connected) def device_list(): for i in range(1, devices_connected +1): # 原代码缺冒号,此处补全 info_1 = subprocess.getoutput(grep 1) # 截取特定设备输出 info_2 = subprocess.getoutput(grep 2) info_3 = subprocess.getoutput(grep 3) output = "{}|{}|{}".format(info_1, info_2, info_3) # 原代码多余的join已移除 yield output for result in device_list(): info_1, info_2, info_3 = result.split("|") list1 = info_1.split() list2 = info_2.split() list3 = info_3.split() print(f"{info_1} | {info_2} | {info_3}") # 正常打印单设备信息 print(list1) # 输出: # ['item1'] # ['item2'] # ['item3'] # 循环外打印仅得到最后一项 print(list1) # 输出:['item3']
问题原因
循环中每次执行list1 = info_1.split(),都是重新创建一个新列表并覆盖原list1变量。循环结束后,list1自然只保留最后一次赋值的结果。
解决方法
提前初始化空列表,在循环中把每个设备的拆分结果合并进去,而非每次重新赋值:
devices_connected = subprocess.getoutput(grep function to grab number of usb devices connected) def device_list(): for i in range(1, devices_connected +1): info_1 = subprocess.getoutput(grep 1) info_2 = subprocess.getoutput(grep 2) info_3 = subprocess.getoutput(grep 3) output = "{}|{}|{}".format(info_1, info_2, info_3) yield output # 提前初始化总列表用于收集所有设备的对应信息 list1 = [] list2 = [] list3 = [] for result in device_list(): info_1, info_2, info_3 = result.split("|") # 将当前设备的拆分结果合并到总列表 list1.extend(info_1.split()) list2.extend(info_2.split()) list3.extend(info_3.split()) print(f"{info_1} | {info_2} | {info_3}") # 循环外打印合并后的完整列表 print(list1) # 输出:['item1', 'item2', 'item3']
补充说明
- 用
extend()是因为info_1.split()返回列表(即使仅含一个元素),extend()会把列表内元素逐个加入总列表;若确定每个info_1拆分后只有一个元素,也可改用list1.append(info_1.split()[0])。 - 原代码中
output = "" .join("{}|{}|{}" .format(...))属于冗余操作,format已生成带分隔符的字符串,无需额外join。
内容的提问来源于stack exchange,提问作者NativeTazuma
相关产品推荐
相关产品推荐

