我有两个列表,可能长度不同。每个列表包含字符串形式的文件名。我不能控制名字,但我确信名字结构不会改变。它总是类似于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))]
我知道它又长又丑,但我真的想向自己证明,它可以通过列表理解来完成。谢谢你的回复!在
未经测试,但逻辑应该是正确的:
我没有用你的
GetNum
,因为它不必要地使事情复杂化。我发现,如果你想在以后很快找到/比较它们的存在,把它们扔进字典会更容易。另外,如果需要数字,只需对文件名执行split
,并从适当的索引中获取所需的值。在我会为这两个列表建立一个字典,其中键是来自文件名的数字,值是文件名本身。然后“相交”两组键,生成的公共键可用于构建第三个列表,例如:
因为我们每次只需要比较第二个列表中的一个项目,所以我在getNum中使用了一个生成器来节省内存。因为一个数字可能不止一次匹配,所以我一直在检查每一项。在
相关问题 更多 >
编程相关推荐