我有两个列表,可能长度不同。每个列表都包含字符串形式的文件名。我无法控制名称,但我确信名称结构不会改变。它总是类似于 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))]
我知道它又长又丑,但我真的想向自己证明它可以通过列表理解来完成。感谢所有有用的回复!