所以,我正在尝试在Python中组合一个列表来匹配大约25,000行的数据。
第一个列表数据来自文件mac.uid,看起来像这样
Mac|ID
第二个列表数据来自serial.uid,如下所示:
Serial|Mac
列表1中的 Mac
必须等于列表2中的Mac
才能加入。
这就是我目前正在做的事情,我相信有太多的重复。
combined = [];
def combineData():
lines = open('mac.uid', 'r+')
for line in lines:
with open('serial.uid', 'r+') as serial:
for each in serial:
a, b = line.strip().split('|')
a = a.lower()
x, y = each.strip().split('|')
y = y.lower()
if a == y:
combined.append(a+""+b+""+x)
最终列表应如下所示:
Mac(List1), ID(List1), Serial(List2)
这样我就可以将它导入Excel工作表了。
感谢您的帮助!
答案 0 :(得分:2)
而不是你的嵌套循环(导致二次复杂性),你应该使用词典,这将给你大致 O ( n log(< i> n )复杂性。为此,请先阅读serial.uid
一次,然后将MAC地址的映射存储到dict
中的序列号。
serial = dict()
with open('serial.uid') as istr:
for line in istr:
(ser, mac) = split_fields(line)
serial[mac] = ser
然后您可以再次关闭该文件并处理mac.uid
查找您刚创建的字典中每个MAC地址的序列号。
combined = list()
with open('mac.uid') as istr:
for line in istr:
(mac, uid) = split_fields(line)
combined.append((mac, uid, serial[mac]))
请注意,我已将combined
从字符串列表更改为元组列表。我还将分裂逻辑分解为一个单独的函数。 (当然,你必须在使用之前加上它的定义。)
def split_fields(line):
return line.strip().lower().split('|')
最后,我建议您开始为变量使用更具描述性的名称。
对于25k行的文件,您应该没有问题将所有内容存储在内存中。如果您的数据集太大,您可能希望开始研究使用数据库。请注意,Python标准库附带SQLite module。