我有两个列表,可能长度不同。每个列表都包含字符串形式的文件名。我无法控制名称,但我确信名称结构不会改变。它总是类似于 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/