我正在尝试合并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')]
答案 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
)构造函数,因为它们是OrderedDict
,key
元组的列表
我们正在做的是从value
和OrderedDict
列表中构建一个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')]