配对来自两个不同列表的元素

时间:2018-04-07 02:02:15

标签: python list

我有两个清单:

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的任何建议吗?

4 个答案:

答案 0 :(得分:3)

您可以将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')]

答案 1 :(得分:0)

<强>鉴于

import itertools as it


list_a = ["a1", "a2", "a3", "a4"]
list_b = ["b2", "b4"]

<强>代码

pred = lambda x: x[1:]
res = [tuple(g) for k, g in it.groupby(sorted(list_a + list_b, key=pred), pred)]
res
# [('a1',), ('a2', 'b2'), ('a3',), ('a4', 'b4')]

list(zip(*it.zip_longest(*res)))
# [('a1', None), ('a2', 'b2'), ('a3', None), ('a4', 'b4')]

<强>详情

平面排序列表按每个字符串的数字分组,并根据谓词生成分组res ults。请注意,如果字符串以单个字母开头,则谓词应适用于任何数字"a1""b23""c132"等。如果您愿意,您也可以考虑@Ajax1234's answer中的尾随数字正则表达式。

正如您所发现的那样,默认情况下itertools.zip_longest会将None填充到更短的子组中。

另见

  • this post了解有关填充iterables的更多建议
  • this post了解如何使用itertool.groupby
  • this post关于自然排序以获得更强大的谓词

答案 2 :(得分:0)

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

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

但是,为了清晰和性能,我会考虑分离数字和字符串数据。

答案 3 :(得分:0)

您可以尝试使用dict方法:

error: the order of `mut` and `ref` is incorrect
 --> src/main.rs:3:17
  |
3 |     if let Some(mut ref mut s) = score {
  |                 ^^^^^^^ help: try switching the order: `ref mut`

error: expected identifier, found keyword `mut`
 --> src/main.rs:3:25
  |
3 |     if let Some(mut ref mut s) = score {
  |                         ^^^ expected identifier, found keyword

error: expected one of `)`, `,`, or `@`, found `s`
 --> src/main.rs:3:29
  |
3 |     if let Some(mut ref mut s) = score {
  |                             ^ expected one of `)`, `,`, or `@` here

输出:

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())