所以我有一个程序,我需要使用从外部文档导入的变量创建4个类的实例。我有一个解决方案,我把它放在下面,但我想知道是否有更简单/更有效的方法,也许是for循环。
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part1 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part2 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part3 = Parts(partsList[0], partsList[1], partsList[2],)
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
part4 = Parts(partsList[0], partsList[1], partsList[2],)
答案 0 :(得分:3)
经验法则:如果您有多个具有相同名称的变量(最后一个数字除外),请用列表替换所有变量。
my_parts = []
for i in range(4):
partsLine = partsDoc.readline()
partsList = partsLine.split(' ')
my_parts.append(Parts(partsList[0], partsList[1], partsList[2],))
您仍然可以使用索引来引用单个部分,例如my_parts[2]
,所以你没有失去任何表现力。
答案 1 :(得分:2)
生成部件的列表,不要使用单个partN
变量名称。使用itertools.islice()
限制从文件到前四个的读取行:
from itertools import islice
parts = []
for line in islice(partsDoc, 4):
part = Parts(*line.split(None, 3)[:3]) # apply the first 3 elements as arguments
parts.append(part)
使用列表理解可以进一步减少这一点:
parts = [Parts(*line.split(None, 3)[:3]) for line in islice(partsDoc, 4)]
从现在开始,您可以使用索引来解决这四个部分:
parts[2]
为您提供文件中第3行的结果。
请注意,我将str.split(' ')
替换为str.split(None, 3)
;这会改变拆分行为,以在开始和结束时去除额外的空白,并限制分割的数量,使其成为您所需要的,而不是更多。
答案 2 :(得分:1)
使用函数创建新的Parts
实例:
def make_part(parts_doc):
parts_line = parts_doc.readline()
parts_list = parts_line.split(' ')
return Parts(parts_list[0], parts_list[1], parts_list[2])
你可以在列表理解中使用它:
parts = [make_part(parts_doc) for _ in range(4)]
通过索引检索实例:
parts[0]
def make_part_from_line(parts_line):
parts_list = parts_line.split(' ')
return Parts(parts_list[0], parts_list[1], parts_list[2])
文件对象是使用next
返回下一行的迭代器:
parts = [make_part_from_line(next(parts_doc)) for _ in range(4)]
def make_part_from_line(parts_line):
return Parts(*parts_line.split(' ')[:3])
*
- 语法将列表解压缩为三个函数参数。
该功能只有一行。直接使用:
parts = [Parts(*next(parts_doc).split(' ')[:3]) for _ in range(4)]