将list元素与第二个不等大小的列表元素

时间:2018-02-28 10:39:16

标签: python

我有两个大小不等的列表,想要将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。

3 个答案:

答案 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'。