Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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按公共元素合并列表_Python_List_Merge - Fatal编程技术网

Python按公共元素合并列表

Python按公共元素合并列表,python,list,merge,Python,List,Merge,我正在尝试合并两个列表,它们之间有一个共同点(在这种情况下是id参数)。 我有这样的想法: list1=[(id1,主机1),(id2,主机2),(id1,主机5),(id3,主机4),(id4,主机6),(id5,主机8)] list2=[(id1,IP1),(id2,IP2),(id3,IP3),(id4,IP4),(id5,IP5)] 主机是唯一的,但是list1中的id可以像您看到的那样重复。 我想要一个将id参数关联到两个列表的输出: 一些输出如: IP1(主机1、主机5)、IP2(主

我正在尝试合并两个列表,它们之间有一个共同点(在这种情况下是
id
参数)。 我有这样的想法:

list1=[(id1,主机1),(id2,主机2),(id1,主机5),(id3,主机4),(id4,主机6),(id5,主机8)]

list2=[(id1,IP1),(id2,IP2),(id3,IP3),(id4,IP4),(id5,IP5)]

主机是唯一的,但是
list1
中的id可以像您看到的那样重复。 我想要一个将
id
参数关联到两个列表的输出:

一些输出如:

IP1(主机1、主机5)、IP2(主机2)、IP3(主机4)、IP4(主机6)、IP5(主机8)

正如您所看到的,IP1有两个关联的主机

有什么快速的方法吗

多谢各位

>>> from collections import defaultdict
>>> list1 = [('id1','host1'),('id2','host2'),('id1','host5'),('id3','host4'),('id4','host6'),('id5','host8')]
>>> list2 = [('id1','IP1'),('id2','IP2'),('id3','IP3'),('id4','IP4'),('id5','IP5')]
>>> d1 = defaultdict(list)
>>> for k,v in list1:
...     d1[k].append(v)
... 
您可以像这样打印项目

>>> for k, s in list2:
...     print s, d1[k]
... 
IP1 ['host1', 'host5']
IP2 ['host2']
IP3 ['host4']
IP4 ['host6']
IP5 ['host8']
您可以使用列表理解将结果放入列表中

>>> res = [(s, d1[k]) for k, s in list2]
>>> res
[('IP1', ['host1', 'host5']), ('IP2', ['host2']), ('IP3', ['host4']), ('IP4', ['host6']), ('IP5', ['host8'])]
  • 使用collections.defaultdict映射id->ip
  • 然后映射id->ip
  • >d=defaultdict(设置)
    >>>d['id'].add('host1')
    >>>d['id'].add('host2')
    >>>d['id'].add('host1')
    >>>d
    defaultdict(,{'id':set(['host2','host1']))
    
    您需要浏览两个列表中的每一个列表,并将其内容添加到一个新列表中,其中包含
    列表类型的元素

    这将产生创建一个包含以下内容的字典的效果:
    {id1:(host1,host5),id2:host2,…}

    然后,您可以遍历并将
    id
    值映射到相应的
    IP

    请注意,要使其工作,必须输入
    id
    值。字符串、数字和其他基本类型是可散列的


    如果
    id
    值是您定义的类的对象,您可以让该类从抽象基类继承。

    可能是这样的吗

    #!/usr/local/cpython-3.3/bin/python
    
    import pprint
    import collections
    
    class Host_data:
        def __init__(self, ip_address, hostnames):
            self.ip_address = ip_address
            self.hostnames = hostnames
            pass
    
        def __str__(self):
            return '{}({})'.format(self.ip_address, ','.join(self.hostnames))
    
        __repr__ = __str__
    
        # The python 2.x way
        def __cmp__(self, other):
            if self.ip_address < other.ip_address:
                return -1
            elif self.ip_address > other.ip_address:
                return 1
            else:
                if self.hostnames < other.hostnames:
                    return -1
                elif self.hostnames > other.hostnames:
                    return 1
                else:
                    return 0
    
        # The python 3.x way
        def __lt__(self, other):
            if self.__cmp__(other) < 0:
                return True
            else:
                return False
    
    
    def main():
        list1=[('id1','host1'),('id2','host2'),('id1','host5'),('id3','host4'),('id4','host6'),('id5','host8')]
    
        list2=[('id1','IP1'),('id2','IP2'),('id3','IP3'),('id4','IP4'),('id5','IP5')]
    
        keys1 = set(tuple_[0] for tuple_ in list1)
        keys2 = set(tuple_[0] for tuple_ in list2)
        keys = keys1 | keys2
    
        dict1 = collections.defaultdict(list)
        dict2 = {}
    
        for tuple_ in list1:
            id_str = tuple_[0]
            hostname = tuple_[1]
            dict1[id_str].append(hostname)
    
        for tuple_ in list2:
            id_str = tuple_[0]
            ip_address = tuple_[1]
            dict2[id_str] = ip_address
    
        result_dict = {}
        for key in keys:
            hostnames = []
            ip_address = ''
            if key in dict1:
                hostnames = dict1[key]
            if key in dict2:
                ip_address = dict2[key]
            host_data = Host_data(ip_address, hostnames)
            result_dict[key] = host_data
    
        pprint.pprint(result_dict)
        print('actual output:')
        values = list(result_dict.values())
        values.sort()
        print(', '.join(str(value) for value in values))
    
        print('desired output:')
        print('IP1(host1,host5), IP2(host2), IP3(host4), IP4(host6), IP5(host8)')
    
    
    main()
    
    #/usr/local/cpython-3.3/bin/python
    导入pprint
    导入集合
    类主机数据:
    定义初始化(self、ip地址、主机名):
    self.ip\u地址=ip\u地址
    self.hostnames=主机名
    通过
    定义(自我):
    返回'{}({})'.format(self.ip_地址','.join(self.hostnames))
    __repr\uuuuu=\uuuuuu str__
    #Python2.x方式
    定义cmp(自身、其他):
    如果self.ip\u地址其他.ip\u地址:
    返回1
    其他:
    如果self.hostnamesother.hostnames:
    返回1
    其他:
    返回0
    #Python3.x方式
    定义(自身、其他):
    如果self.\uuu cmp\uuu(其他)<0:
    返回真值
    其他:
    返回错误
    def main():
    列表1=[('id1','host1'),('id2','host2'),('id1','host5'),('id3','host4'),('id4','host6'),('id5','host8')]
    列表2=[('id1','IP1'),('id2','IP2'),('id3','IP3'),('id4','IP4'),('id5','IP5')]
    keys1=set(列表1中的元组[0]的元组)
    keys2=set(列表2中的tuple_u0的tuple_0)
    键=键1 |键2
    dict1=集合。默认DICT(列表)
    dict2={}
    对于列表1中的元组:
    id\u str=元组[0]
    主机名=元组[1]
    dict1[id\u str]。追加(主机名)
    对于列表2中的tuple_uu:
    id\u str=元组[0]
    ip地址=元组[1]
    dict2[id\u str]=ip\u地址
    结果_dict={}
    对于键入键:
    主机名=[]
    ip_地址=“”
    如果输入dict1:
    hostnames=dict1[key]
    如果输入dict2:
    ip_地址=dict2[键]
    主机数据=主机数据(ip地址、主机名)
    结果dict[键]=主机数据
    pprint.pprint(结果)
    打印('实际输出:')
    值=列表(结果值()
    value.sort()
    打印(“,”.join(str(value)表示值中的值))
    打印('所需输出:')
    打印('IP1(主机1、主机5)、IP2(主机2)、IP3(主机4)、IP4(主机6)、IP5(主机8)')
    main()
    
    代码:

    list1=[('id1','host1'),('id2','host2'),('id1','host5'),('id3','host4'),('id4','host6'),('id5','host8')]
    list1 = map(list,list1)
    list2=[('id1','IP1'),('id2','IP2'),('id3','IP3'),('id4','IP4'),('id5','IP5')]
    list2 = map(list,list2)
    
    for item in list1:
        item += [x[1] for x in list2 if x[0]==item[0]]
    
    list1 += [x for x in list2 if not any(i for i in list1 if x[0]==i[0])]
    
    print list1
    
    输出:

    [['id1', 'host1', 'IP1'], ['id2', 'host2', 'IP2'], ['id1', 'host5', 'IP1'], ['id3', 'host4', 'IP3'], ['id4', 'host6', 'IP4'], ['id5', 'host8', 'IP5']]  
    

    希望这有帮助:)

    我认为输出的顺序应该与list2@gnibbler从列表2中获取id,然后在dict中搜索id
    from collections import defaultdict
    list1 = [("id1","host1"),("id2","host2"),("id1","host5"),("id3","host4"),("id4","host6"),("id5","host8")]
    list2 = [("id1","IP1"),("id2","IP2"),("id3","IP3"),("id4","IP4"),("id5","IP5")]
    host = defaultdict(list)
    IP4id = {}
    for k, v in list2:
        IP4id[v] = {"id" : k, "host" : []}
    
    for k, v in list1:
        host[k].append(v)
    
    for item in IP4id:
        IP4id[item]["host"] = host[IP4id[item]["id"]]
    print IP4id