在两个包含子字符串的列表中查找元素

2024-09-30 10:35:56 发布

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

我有两个列表,可能长度不同。每个列表包含字符串形式的文件名。我不能控制名字,但我确信名字结构不会改变。它总是类似于name1\u name2\u number1_+(或-)number2.jpg

Number1是我想在两个列表之间匹配的子字符串。如果一个列表中的文件名与另一个列表中的文件名包含相同的数字1,我想将这两个文件名附加到第三个列表中。我有一个简单的函数,可以得到给定列表中的数字1,例如:

>>>list1 = ['serentity01_20malcolm_200_+3.jpg','inara03_kaley40_8000_-1.jpg']
>>>def GetNum(imgStrings):
...    ss = []
...    for b in imgStrings:
...        ss.append([w for w in b.split('_') if w.isdigit()])
...    #flatten zee list of lists because it is ugly.
...    return [val for subl in ss for val in subl]
>>>GetNum(list1)
['200', '800]

所以,为了

^{pr2}$

我觉得我应该可以用GetNum函数和一些列表理解来完成它,但是整个“[blah for blah in…]”语法的妙处对我来说是新的,我不能完全把我的脑袋放在这个语法上。思想?建议?死亡威胁?感谢所有提前给出的有帮助的回复,如果我的googlefu未能找到类似的问题/答案,我将万分抱歉。在

编辑 我刚刚想出了一个解决方案:

[str for str in list1+list2 if any(subs in str for subs in GetNum(list1)) and any(subs in str for subs in GetNum(list2))]

我知道它又长又丑,但我真的想向自己证明,它可以通过列表理解来完成。谢谢你的回复!在


Tags: 函数字符串in列表for文件名数字名字
3条回答

未经测试,但逻辑应该是正确的:

list1 = ['serentity01_20malcolm_200_+3.jpg','inara03_kaley40_8000_-1.jpg']
list2 = ['inara03_summer40_8000_-2.jpg', 'book23_42jayne_400_+2.jpg', 'summer53_21simon_300_-1.jpg']
list3 = []

seenInList1Dict = {}

for element in list1:
    splitelem = element.split('_')
    seenInList1Dict[splitelem[2]] = 1

for element in list2:
    splitelem = element.split('_')
    if splitelem[2] in seenInList1Dict:
        list3.append(element)

我没有用你的GetNum,因为它不必要地使事情复杂化。我发现,如果你想在以后很快找到/比较它们的存在,把它们扔进字典会更容易。另外,如果需要数字,只需对文件名执行split,并从适当的索引中获取所需的值。在

我会为这两个列表建立一个字典,其中键是来自文件名的数字,值是文件名本身。然后“相交”两组键,生成的公共键可用于构建第三个列表,例如:

def List2Dic(List):
    return dict(map(lambda x: [ x.split("_")[2], x], List))

list1 = ['serentity01_20malcolm_200_+3.jpg','inara03_kaley40_8000_-1.jpg']
list2 = ['inara03_summer40_8000_-2.jpg', 'book23_42jayne_400_+2.jpg', 'summer53_21simon_300_-1.jpg']

d1 = List2Dic(list1)
d2 = List2Dic(list2)

for x in set(d1) & set(d2):
    print d1[x], d2[x]
list1 = ['serentity01_20malcolm_200_+3.jpg','inara03_kaley40_8000_-1.jpg']
list2 = ['inara03_summer40_8000_-2.jpg', 'book23_42jayne_400_+2.jpg', 'summer53_21simon_300_-1.jpg']

def getNum(image_name_list):
    for s in image_name_list:
        s = s.split('_')[2]
        if s.isdigit():
           yield s        
        else:
            yield None

def getMatchingIndex(list1, list2):
    other_list = list(getNum(list2))
    for (i, num) in enumerate(getNum(list1)):
        if not num:
            continue
        for (j, other_num) in enumerate(getNum(list2)):
            if (num == other_num):
                yield (i, j)

for i1, i2 in getMatchingIndex(list1, list2):
    print list1[i1], list2[i2]

因为我们每次只需要比较第二个列表中的一个项目,所以我在getNum中使用了一个生成器来节省内存。因为一个数字可能不止一次匹配,所以我一直在检查每一项。在

相关问题 更多 >

    热门问题