在Python中组合2个对列表
我正在尝试合并两个成对的列表 清单1: 清单2: 我想将列表1加入到列表2中,但只想在列表2中不存在的情况下添加列表1中的项。 如您所见,列表1有user1、user2、user3和user4,但列表2只有user1、user2和user4 组合列表包含列表2中的所有用户以及列表1中的额外用户 综合清单:在Python中组合2个对列表,python,Python,我正在尝试合并两个成对的列表 清单1: 清单2: 我想将列表1加入到列表2中,但只想在列表2中不存在的情况下添加列表1中的项。 如您所见,列表1有user1、user2、user3和user4,但列表2只有user1、user2和user4 组合列表包含列表2中的所有用户以及列表1中的额外用户 综合清单: 在保留排序顺序的同时进行重复数据消除的详细讨论。在这种情况下,如果转换为字典,则消除重复条目非常简单: from collections import OrderedDict print(li
在保留排序顺序的同时进行重复数据消除的详细讨论。在这种情况下,如果转换为字典,则消除重复条目非常简单:
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或ORDERDEDDICT构造函数,因为它们是键、值元组的列表
我们正在做的是从dyndns和ip列表组合构建一个OrderedDict,这将确保键符合dyndns列表中定义的顺序,但是来自ip的任何值都将超过dyndns中定义的值,因为后面的值会覆盖前面的值。然后,通过调用项并转换为列表,我们将其转换回元组列表
如果顺序不重要,或者您使用的是python 3.6+,则可以简化为:
print(list(dict(dyndns + ip).items()))
我们从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)
这将产生:
[('user1', '1.1.1.1'), ('user2', '1.1.1.2'), ('user3', 'dyndns3'), ('user4', '1.1.1.4')]
下面的代码可以用来实现输出。它根据关键字参数使用Python的排序函数
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)
输出
试试这个:-
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')]
不明白为什么需要dict?@UV便于合并。同意作为dict更好。但更新不会返回任何值,因此会引发属性错误。修复了@101Matthew,脚本将如何组合两个列表,然后打印输出?如果ip无法定义dns列表中不存在的任何用户密钥,这将非常好
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')]
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')]
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')]