我有两个清单:
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
的任何建议吗?
答案 0 :(得分:3)
您可以将iter
与next
:
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
填充到更短的子组中。
另见
答案 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())