将项目分成两个列表

时间:2017-11-17 02:43:51

标签: python

我有两个清单:

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

如何解决这样的问题?

4 个答案:

答案 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))