在Python中合并2对列表

时间:2018-07-04 04:29:36

标签: python

我正在尝试合并2对列表。

列表1:

dyndns = [('user1', 'dyndns1'), ('user2', 'dyddns2'), ('user3', 'dyndns3'), ('user4', 'dyddns4')]

列表2:

ip = [('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user4', '1.1.1.4')]

我想将列表1加入列表2,但是仅想从列表1中添加项目(如果列表2中不存在该项目)。
如您所见,列表1具有user1,user2,user3和user4,但是列表2仅具有user1,user2和user4
合并后的列表包含列表2中的所有用户以及列表1中的其他用户

组合列表:

combined = [('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user3', 'dyndns3'), ('user4', '1.1.1.4')]

5 个答案:

答案 0 :(得分:4)

ip_dict = dict(ip)
print([(user, ip_dict.get(user, dns)) for user, dns in dyndns])

这将输出:

[('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user3', 'dyndns3'), ('user4', '1.1.1.4')]

答案 1 :(得分:2)

可以在here中找到有关在保留排序顺序的同时进行重复数据删除的冗长讨论。在这种情况下,如果您转换为字典,则对重复项进行重复删除非常简单:

create table x (a char(5), b varchar2(5));
insert into x value ('RAM', 'RAM');
insert into x value ('RAMA', 'RAMA');
insert into x value ('RAMAN', 'RAMAN');

SELECT * FROM X WHERE length(a) = 3; -> this will return 0 record
SELECT * FROM X WHERE length(b) = 3; -> this will return 1 record (RAM)

SELECT length(a) len_a, length(b) len_b from x ; 
o/p will be like below
len_a | len_b
-------------
5     | 3
5     | 4
5     | 5

哪个输出您想要的结果:

from collections import OrderedDict
print(list(OrderedDict(dyndns + ip).items()))

有关更多上下文,您的列表已经正确设置格式,可以发送到[('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user3', 'dyndns3'), ('user4', '1.1.1.4')] (或dict)构造函数,因为它们是OrderedDictkey元组的列表

我们正在做的是从valueOrderedDict列表中构建一个dyndns,这将确保密钥按ip列表中定义的顺序进行,但是dyndns中的任何值都将覆盖ip中定义的值(因为后面的值会覆盖前面的值)。然后,我们通过调用dyndns并转换为items来转换回元组列表。

如果顺序不重要(或者您使用的是Python 3.6+),则可以简化为:

list

答案 2 :(得分:1)

我们从ip(列表2)获取密钥或用户列表。 并在另一个列表上进行迭代,以检查密钥是否已经在列表2中存在,如果不存在,则添加到列表中。

ip = [('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user4', '1.1.1.4')]
dyndns = [('user1', 'dyndns1'), ('user2', 'dyddns2'), ('user3', 'dyndns3'), ('user4', 'dyddns4')]
ip_keys = list(map (lambda x:x[0], ip))
for i in dyndns:
    if (not i[0] in ip_keys):
        ip.append(i)

答案 3 :(得分:0)

以下代码可用于实现输出。它基于 key 关键字参数使用了Python的 sorted()函数。

def get_combined_users(list1, list2):
    usernames = set()
    combined = []

    for user in sorted(list2 + list1, key=lambda user: user[0]): # Do not use => list1 + list2
        if not user[0] in usernames:
            usernames.add(user[0])
            combined.append(user)

    return combined

if __name__ == "__main__":
    dyndns = [('user1', 'dyndns1'), ('user2', 'dyddns2'), ('user3', 'dyndns3'), ('user4', 'dyddns4')]
    ip = [('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user4', '1.1.1.4')]

    combined = get_combined_users(dyndns, ip)
    print(combined)

输出

[('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user3', 'dyndns3'), ('user4', '1.1.1.4')]

答案 4 :(得分:0)

试试这个:-

def get(l1,l2):
    la1 = [i[0] for i in l1]
    la2 = [i[0] for i in l2]
    for i in la1:
        if i not in la2:
            l2.append(l1[la1.index(i)])
    return l1


print(get([('user1', 'dyndns1'), ('user2', 'dyddns2'), ('user3', 'dyndns3'), 
('user4', 'dyddns4')],[('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user4', 
'1.1.1.4')]
))

#output:-- [('user1', 'dyndns1'), ('user2', 'dyddns2'), ('user3', 'dyndns3'), ('user4', 'dyddns4')]