我有两个清单:
foo = ['learn.py', 'work.py','entertain.py','else']
bar = ['A.learn.py', '3.entertain.py','&work.py']
我想要的结果是
('learn.py', 'A.learn.py'), ('work.py', '&work.py'),
('entertain.py','3.entertain.py'), ('else','else')]
以下是我的代码:
zoo = []
for j in bar:
for i in foo:
if i in j:
zoo.append((i,j))
In [3]: zoo
Out[3]: [('learn.py', 'A.learn.py'), ('work.py', '&work.py')]
,或者
zoo = []
for i in foo:
for j in bar:
if i in j:
zoo.append((i,j))
In [5]: zoo
Out[5]: [('learn.py', 'A.learn.py'), ('work.py', '&work.py')]
如何解决这样的问题?
答案 0 :(得分:2)
如果我理解正确,bar
包含的元素本身包含来自foo
的元素,对吗?请注意entertain.py
未包含在当前列表中的原因是因为它在bar
中拼写错误。这应该有效:
foo = ['learn.py', 'work.py','entertain.py','else']
bar = ['A.learn.py', '3.entertain.py','&work.py']
zoo = []
for i in foo:
item = next((item for item in bar if i in item), None)
if item:
zoo.append((i, item))
else:
zoo.append((i,i))
答案 1 :(得分:1)
您可以使用字符串endswith()
方法检查匹配项,并在内部else:
循环上使用for j in bar:
来处理未找到匹配项时的情况:
foo = ['learn.py', 'work.py', 'entertain.py', 'else']
bar = ['A.learn.py', '3.entertain.py', '&work.py']
zoo = []
for i in foo:
for j in bar:
if j.endswith(i): # Match?
zoo.append((i, j))
break
else:
zoo.append((i, i))
print(zoo)
输出:
[('learn.py', 'A.learn.py'), ('work.py', '&work.py'), ('entertain.py', '3.entertain.py'), ('else', 'else')]
答案 2 :(得分:0)
是的,如前所述,假设foocpy = foo.copy()
zoo = [(f, b) for f, b in product(foo, bar) if f in b and not foocpy.remove(f)]
zoo+= [(f, f) for f in foocpy]
del foocpy
被拼错了,你可以试试这个:
in
否则,请执行您自己的比较检查,而不是使用1.mysql 5.6.36
2.mybatis 3.4.5
。
答案 3 :(得分:0)
我会在这里扔东西以获得乐趣(仍然可以回答这个问题)。 当机会出现时,为什么不使用Levenshtein距离。
32bit
结果:
from fuzzywuzzy import fuzz
import itertools
new_list_y =[]
for num_x, x in enumerate(foo):
for num_y, y in enumerate(bar):
if fuzz.ratio(x, y) > 85:
new_list_y.append(y)
if num_x > num_y:
new_list_y.append(x)
list(itertools.zip_longest(foo, new_list_y))