将两个不同列表中的元素配对

2024-05-23 14:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子:

listA = ['a1', 'a2', 'a3', 'a4']
listB = ['b2', 'b4']

我想对格式为的任何字符串中的项目进行配对,例如:

listC = [('a1', None),('a2', 'b2'),('a3', None),('a4', 'b4')]

我试过itertools.zip_longest但是我没有得到我需要的:

>>>list(itertools.zip_longest(listA, listB)
[('a1', 'b2'), ('a2', 'b4'), ('a3', None), ('a4', None)]

有什么建议如何获得listC?你知道吗


Tags: nonea2longesta1格式zipb2a3
3条回答

您可以尝试dict方法:

listA = ['a1', 'a2', 'a3', 'a4']
listB = ['b2', 'b4']

final_list={}
import itertools

for i in itertools.product(listA,listB):
    data,data1=list(i[0]),list(i[1])
    if data[1]==data1[1]:
        final_list[i[0]]=i
    else:
        if i[0] not in final_list:
            final_list[i[0]]=(i[0],None)

print(final_list.values())

输出:

[('a2', 'b2'), ('a3', None), ('a4', 'b4'), ('a1', None)]

您可以将列表理解与三元语句结合使用:

listA = ['a1', 'a2', 'a3', 'a4']
listB = ['b2', 'b4']

listB_set = set(listB)
listC = [(i, 'b'+i[1:] if 'b'+i[1:] in listB_set else None) for i in listA]

# [('a1', None), ('a2', 'b2'), ('a3', None), ('a4', 'b4')]

但是,为了清晰和性能,我会考虑将数字和字符串数据分开。你知道吗

可以将iternext一起使用:

listA = ['a1', 'a2', 'a3', 'a4']
listB = ['b2', 'b4']
l = iter(listB)
listC = [(a, next(l) if i%2 != 0 else None) for i, a in enumerate(listA)] 

输出:

[('a1', None), ('a2', 'b2'), ('a3', None), ('a4', 'b4')]

编辑:按尾随数字配对:

import re
listA = ['a1', 'a2', 'a3', 'a4']
listB = ['b2', 'b4']
d = {re.findall('\d+$', b)[0]:b for b in listB}
listC = [(i, d.get(re.findall('\d+$', i)[0])) for i in listA]

输出:

[('a1', None), ('a2', 'b2'), ('a3', None), ('a4', 'b4')]

相关问题 更多 >