Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中组合2个对列表_Python - Fatal编程技术网

在Python中组合2个对列表

在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

我正在尝试合并两个成对的列表

清单1:

清单2:

我想将列表1加入到列表2中,但只想在列表2中不存在的情况下添加列表1中的项。 如您所见,列表1有user1、user2、user3和user4,但列表2只有user1、user2和user4 组合列表包含列表2中的所有用户以及列表1中的额外用户

综合清单:


在保留排序顺序的同时进行重复数据消除的详细讨论。在这种情况下,如果转换为字典,则消除重复条目非常简单:

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')]