基于多对一关系将列表压缩在一起

2024-06-26 13:40:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,我想找到一种方法将它们连接在一起(我不确定确切的术语是这样做的)压缩它们。在

在列表一中,我有一系列tif文件:

    list1=['LT50300281984137PAC00_sr_band1.tif',
    ,'LT50300281984137PAC00_sr_band2.tif'  
    'LT50300281984137PAC00_sr_band3.tif','LT50300281994260XXX03_sr_band1.tif',
    'LT50300281994260XXX03_sr_band2.tif',
    'LT50300281994260XXX03_sr_band3.tif']

在列表2中,我有两个文件:

^{pr2}$

我想将列表1中以LT50300281984137PAC00开头的文件压缩到以相同方式开始的列表2中的文件,以LT50300281994260XXX03开头的文件也是如此

我尝试过的代码是:

ziplist=zip(sorted(list1),sorted(list2)

但这会带来:

[('LT50300281984137PAC00_sr_band1', 'LT50300281984137PAC00_mask.tif'), ('LT50300281984137PAC00_sr_band2', 'LT50300281994260XXX03_mask.tif')] 

我想退回这个:

 [('LT50300281984137PAC00_sr_band1',LT50300281984137PAC00_sr_band2,LT50300281984137PAC00_sr_band3, 'LT50300281984137PAC00_mask.tif'), ('LT50300281994260XXX03_sr_band1.tif', 'LT50300281994260XXX03_sr_band2.tif','LT50300281994260XXX03_sr_band3.tif','LT50300281994260XXX03_mask.tif')] 

Tags: 文件方法列表mask术语sortedtifsr
3条回答

也可以使用regex来完成。在

import re
list1=['LT50300281984137PAC00_sr_band1.tif'
       ,'LT50300281984137PAC00_sr_band2.tif',  
       'LT50300281984137PAC00_sr_band3.tif','LT50300281994260XXX03_sr_band1.tif',
       'LT50300281994260XXX03_sr_band2.tif',
       'LT50300281994260XXX03_sr_band3.tif']

list2=['LT50300281984137PAC00_mask.tif','LT50300281994260XXX03_mask.tif']

match = re.findall(r'(\b\w+(?:PAC00)\w+.\w+\b)'," ".join(list1))
tuple1 =  tuple(match+[list2[0]])


match = re.findall(r'(\b\w+(?:0XXX0)\w+.\w+\b)'," ".join(list1))
tuple2 =  tuple(match+[list2[1]])

print [tuple1,tuple2]

输出

^{pr2}$

您可以使用列表理解和内置函数filter

In [24]: [tuple(filter(lambda x: x.startswith(e.split('_')[0]), list1)+[e]) for e in list2]
Out[24]:
[('LT50300281984137PAC00_sr_band1.tif',
  'LT50300281984137PAC00_sr_band2.tif',
  'LT50300281984137PAC00_sr_band3.tif',
  'LT50300281984137PAC00_mask.tif'),
 ('LT50300281994260XXX03_sr_band1.tif',
  'LT50300281994260XXX03_sr_band2.tif',
  'LT50300281994260XXX03_sr_band3.tif',
  'LT50300281994260XXX03_mask.tif')]

您可以使用itertools.groupby

from itertools import groupby

list1 = [
    'LT50300281984137PAC00_sr_band1.tif',
    'LT50300281984137PAC00_sr_band2.tif',
    'LT50300281984137PAC00_sr_band3.tif',
    'LT50300281994260XXX03_sr_band1.tif',
    'LT50300281994260XXX03_sr_band2.tif',
    'LT50300281994260XXX03_sr_band3.tif'
]

list2 = [
    'LT50300281984137PAC00_mask.tif',
    'LT50300281994260XXX03_mask.tif'
]

def extract_key(s):
    return s[:s.index('_')]

l = sorted(list1 + list2, key=extract_key)
l = [tuple(items) for s, items in groupby(l, key=extract_key)]

结果:

^{pr2}$

其思想是根据每个文件名(extract_key)的第一部分对两个列表的并集进行排序。然后使用groupby创建第一部分相同的组。在

相关问题 更多 >