我有两个大小不等的列表,想要将new_list中的元素与old_list中的元素进行比较。
new_list = [['<id>','<name>','<account_id>','<ip_address>'], ...]
old_list = [['<id>','<ip_address>'], ...]
我有一个数据库,我想跟踪ip_address更改,所以我得到一个old_list,如果相同id的new_list中的ip_address不同,请更新数据库。
for x in new_list:
for y in old_list:
if x[3] in y[0]:
# update the DB
这似乎有效,但看起来好像在列表增长时会变得非常低效。
new_list目前有700个元素。 old_list目前有600个元素。
当使用上面的循环时,它会带回超过300,000。
注意:有些可能没有与之关联的ip_address。
答案 0 :(得分:2)
而不是每次循环遍历old_list。创建所有旧IP的列表,然后使用新列表进行检查。
<强> EX:强>
old_ip_list = set(y[0] for y in old_list)
for x in new_list:
if x[3] in old_ip_list:
#Do Update+
答案 1 :(得分:0)
您可以尝试使用词典。
>>> old_dict = {'<id>':{'name':'<name>','account_id':'<account_id>','ip_address':'<ip_address>'}}
>>> new_dict = {'<id>':{'name':'<new_name>','account_id':'<new_account_id>','ip_address':'<new_ip_address>'}}
>>> old_dict['<id>'].update(new_dict['<id>'])
>>> old_dict
{'<id>': {'name': '<new_name>', 'account_id': '<new_account_id>', 'ip_address': '<new_ip_address>'}}
或者,如果您需要专门捕获IP地址的更改,词典可以轻松有效地进行比较。
>>> old_dict['<id>']['ip_address'] == new_dict['<id>']['ip_address']
True
字典也是不同长度信息集的首选结构,因为在进行下一个操作之前,如果字符在字典中存在,则很容易测试。
>>> '<id>' in old_dict
True
>>> 'ip_address' in old_dict['<id>']
True
>>> 'test' in old_dict['<id>']
False
字典也与json和数据帧非常兼容,使它们成为数据分析和API的理想选择。最好的部分是尽管它们有用,但pyhton词典是非常有效的数据结构。
答案 2 :(得分:0)
使用大量数据时,字典查找比列表查找更快。如果我理解正确,您希望查找记录,其中来自new的id
具有与旧版本中的id
不同的IP地址。这是一个解决方案:
new_list = [[1,'qwe',123,'1.1.1.1'],
[2,'asd',234,'2.2.2.2'],
[3,'zxc',345,'3.3.3.3']]
old_list = [[2,'2.2.2.2'],
[3,'4.4.4.4'],
[4,'5.5.5.5']]
# Map old IDs to old IP addresses, to be used for faster lookup than list
old_dict = dict(old_list)
for x in new_list:
new_ip = x[3]
new_id = x[0]
if new_id in old_dict and old_dict[new_id] != new_ip:
print(new_id, new_ip)
# Update DB
输出是:
3 3.3.3.3
因为id 3在new_list中有IP地址'3.3.3.3',在旧列表中有'4.4.4.4'。