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

标签 python list-comprehension string-matching

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

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

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

所以,对于

>>>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']
>>>awesomesauceSubstringMatcher(list1, list2)
['inara03_kaley40_8000_-1.jpg', 'inara03_summer40_8000_-2.jpg']

我觉得我应该能够用我的 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))]

我知道它又长又难看,但我真的想向自己证明它可以通过列表理解来完成。感谢您的所有有用回复!

最佳答案

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 中使用了生成器来节省内存。由于一个数字可能会多次匹配,因此我会不断检查每个项目。

关于python - 查找两个列表中包含子字符串的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15439739/

相关文章:

python - 写入使用 Paramiko/pysftp "open"方法打开的 SFTP 服务器上的文件很慢

list - 在 Haskell 中,列表理解的内部工作原理是什么?

python - 如何对字符串的相似度进行分组和求和

regex - 找出两个Glob模式(或正则表达式)的匹配项是否相交的算法

python - 如何从python中删除某个IE cookie?

python - 登录 admin 后 Django 开发服务器停止

python - LSTM - 使用 deltaTime 作为功能?如何处理不规则的时间戳?

python - 如何比较两个列表以保持匹配的子字符串?

python - 创建字节范围(用于请求部分数据)

ruby - 如何匹配字符串直到文本文件结尾?